对于 JS 的数据类型我们知道可以分为两大类:基础数据类型 6 个(Undefined
、Null
、 Number
、 Boolean
、 String
、Symbol
)和复杂数据类型 1 个(Object
)。我们也知道对于复杂数据类型之一的数组,可以拥有自己的属性和方法,比如 arr.length
。但对于基础数据类型字符串 “abc”,居然也可以使用 .length
这就是包装对象在其中的“操作”。
基本类型包装对象
对象是 JS 中最主要的数据类型,三种原始类型的值: Number、 String、 Boolean 这三个内置对象可以把原始类型的值在一定条件下自动转为 object,也就是原始类型的包装对象。
同样的,包装后的 object 也能转换成原始类型的值。
基本数据类型想要参与属性、方法调用时,会自动“装箱”,复杂数据类型想要进行基本数据类型的操作时,也会自动“拆箱”。
包装对象设计的目的:
- 使得 “object” 这种数据类型可以涵盖 JS 所有的值
- 使得原始数据类型的值也可以使用自己的属性和方法
number 类型的装箱拆箱:
let a = 5, b = new Number(6);
console.log(typeof a, typeof b); // number object
console.log(a + b); // 11 能发现 number 同样能与 object 进行运算
a = a.toString(); // number 类型的 a 也有方法可以调用
console.log(typeof a, typeof b); // string object
字符串的装箱拆箱:
let str1 = "hello", str2 = new String("world");
console.log(typeof str1, typeof str2); // string object
console.log("add" + str1, "add" + str2); //addhello addworld
在 JS 中有一种“万物皆对象”的说法,那么了解了包装对象,让我们对这一说法有了新的认识。
valueOf() 和 toString()
valueOf() 方法返回包装对象实例对应的原始类型的值,即 obj => basic
new Number(111).valueOf() // 111
new String('abc').valueOf() // "abc"
new Boolean(false).valueOf() // false
toString() 方法返回对应的字符串形式,即 obj => string
new Number(111).toString() // 结果:"111"
new String('abc').toString() // 结果:"abc"
new Boolean(false).toString() // 结果:"false"