什么是包装对象

什么是包装对象看一个例子:

1
2
3
var str = 'This is a string';	// 定义一个字符串
str.length // 16
str.toUpperCase() // "THIS IS A STRING"

定义一个字符串,它不是对象,为什么它会有属性方法呢?

原因就是JavaScript会将字符串值通过new String()的方式创建临时对象,而这个临时对象继承字符串的方法。

结果就像上面看到的,可以访问调用继承的属性方法。

同字符串一样,数字和布尔类型的值也会使用相应的Number()和Boolean()构造函数,去实例化这个临时对象,然后继承各自的方法,这就是包装对象。

与显式的构造函数创建的包装对象有什么不同

直接上代码

1
2
3
4
5
6
var str = 'This is a string';	// 定义一个字符串
str.num = 20 // 添加属性值
str.num // undefined 属性定义无效
var strObj = new String('This is a string'); // String {"This is a string"}
strObj.num = 20
strObj.num // 20 成功添加属性

字符串存取值所创建的临时对象,所有属性操作都在临时对象上,并不能被保存下来,所以说无论设置什么属性都是没有用的。

而通过构造函数显式创建的包装对象是可以添加属性方法的,因为它是实例化的对象,是可以赋予属性及方法的。

image-20200728221150815

值表现

1
2
3
4
str == strObj	// true  == 会使strObj调用toStrng()方法转换成字符串与之比较
str === strObj // false === 则会直接比较
typeof str // "string"
typeof strObj // "object"

ps:

null 和 undefined 没有包装对象访问属性会报类型错误