对于 JS 的数据类型我们知道可以分为两大类:基础数据类型 6 个(UndefinedNullNumberBooleanStringSymbol)和复杂数据类型 1 个(Object)。我们也知道对于复杂数据类型之一的数组,可以拥有自己的属性和方法,比如 arr.length。但对于基础数据类型字符串 “abc”,居然也可以使用 .length 这就是包装对象在其中的“操作”。

基本类型包装对象

对象是 JS 中最主要的数据类型,三种原始类型的值: Number、 String、 Boolean 这三个内置对象可以把原始类型的值在一定条件下自动转为 object,也就是原始类型的包装对象。

同样的,包装后的 object 也能转换成原始类型的值。

基本数据类型想要参与属性、方法调用时,会自动“装箱”,复杂数据类型想要进行基本数据类型的操作时,也会自动“拆箱”。

包装对象设计的目的:

  1. 使得 “object” 这种数据类型可以涵盖 JS 所有的值
  2. 使得原始数据类型的值也可以使用自己的属性和方法

number 类型的装箱拆箱:

  1. let a = 5, b = new Number(6);
  2. console.log(typeof a, typeof b); // number object
  3. console.log(a + b); // 11 能发现 number 同样能与 object 进行运算
  4. a = a.toString(); // number 类型的 a 也有方法可以调用
  5. console.log(typeof a, typeof b); // string object

字符串的装箱拆箱:

  1. let str1 = "hello", str2 = new String("world");
  2. console.log(typeof str1, typeof str2); // string object
  3. console.log("add" + str1, "add" + str2); //addhello addworld

在 JS 中有一种“万物皆对象”的说法,那么了解了包装对象,让我们对这一说法有了新的认识。

valueOf() 和 toString()

valueOf() 方法返回包装对象实例对应的原始类型的值,即 obj => basic

  1. new Number(111).valueOf() // 111
  2. new String('abc').valueOf() // "abc"
  3. new Boolean(false).valueOf() // false

toString() 方法返回对应的字符串形式,即 obj => string

  1. new Number(111).toString() // 结果:"111"
  2. new String('abc').toString() // 结果:"abc"
  3. new Boolean(false).toString() // 结果:"false"