对象包装器
所有包装器都是内置对象,如 Number
、String
、Boolean
等。
1. 装箱
通常在对一个变量赋值的时候,都会直接给定一个字面量。
var string = '996 say no!';
console.log(typeof string);
var string = '996 say no!';
console.log(typeof string);
console.log(string.length);
照道理讲只有对象才能访问到属性,字符串字面量只是一个值而已。
这里就是因为 JavaScript
内部的拆装箱的机制。
当把一个字面量像对象一样操作的时候,JavaScript
会进行装箱操作。
var string = '996 say no!';
console.log(typeof string);
console.log((new String(string)).length);
其中的 new String
就是装箱操作,String
就是字符串的对象包装器。
需要注意的是,对一个字面量包装后不会修改原始值,上述例子中的 string
变量的值依然是字符串字面量,不会变成对象,所以每一次对一个字面量做访问属性或方法的操作时,都会做一次装箱操作。
许多开发者会考虑频繁装箱的性能影响,其实通常是不必要的,一是现在计算机和浏览器的处理执行速度很快了,几乎可以忽略不计装箱的开销,另外就是业务开发中在没有明确的性能要求下,是不考虑性能的,以完成业务逻辑为主。
2. 拆箱
var obj = {
toString: function() {
return '996';
},
};
console.log(
'996' == obj,
);
上述例子,在字符串字面量 996
和对象 obj
进行比较的时候,会尝试将右侧的对象转化成字符串,即调用 toString
方法(在 ES6 中则会先看有没有部署 Symbol.toPrimitive 方法)。
3. 小结
理解对象包装器的作用,可以更好的理解内置对象的用途。