Javascript 包装对象

先看一个简单的例子:

1
2
3
4
var str = "corlymeng.com";
console.log(typeof str); // string
str.charAt(2);
str.indexOf('l');

在第二行我们输出str的类型是:字符串,但是我们发现str可以调用charAt、indexOf等方法。这时我们有一个疑问:字符串是一个基本类型,它怎么可能拥有方法呢? 只有对象类型的才可以调用方法。

包装对象基本类型都有自己对应的包装对象:String、Number、Boolean。

1
2
3
4
5
var str = new String("corlymeng.com");
console.log(typeof str); // Object
str.charAt(1);
//在源码中实际上是这样实现的
String.prototype.charAt = function(){}

现在我们来解释上面的例子:当str调用charAt方法的时候,基本类型会找到对应的包装对象类型,然后包装对象把所有的属性和方法给了基本类型,然后包装对象消失。

现在我们想给字符串添加一个方法,我们该如何添加呢?

1
2
3
4
5
var str = "corlymeng.com";
String.prototype.lastValue = function(){
return this.charAt(this.length-1);
}
console.log(str.lastValue());

因此当我们想给基本类型添加方法时,就要添加到基本类型所对应的包装对象上。

下面我们来看一个面试题:

1
2
3
4
var str = "corlymeng.com";
str.number = 10;
console.log(typeof str); // string
console.log(str.number); // undefined

为什么会输出undefined呢?

第二行给基本类型添加属性的时候,基本类型就会找到对应的包装对象类型,然后创建一个对象,把number = 10属性添加到创建的对象下,由第三行输出的是string,我们可以知道此时包装对象就消失了。

当第四行去调用number时,它又去创建了一个对象,但新创建的对象并没有number属性。

欢迎关注我的其它发布渠道