您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

对象包装器

对象包装器也被称为 包装器包装对象.

所有包装器都是内置对象,如 NumberStringBoolean 等。

通常在对变量赋值的时候,都会直接给定字面量。

var string = '996 say no!';

console.log(typeof string); // :"string"

通过类型的检测,可以知道他是字符串。

但又可以访问到一些,比如 length

var string = '996 say no!';

console.log(typeof string); // :"string"
console.log(string.length); // :11

照道理讲只有对象才能访问到,字符串字面量只是值而已。

这里就是因为 JavaScript 内部的拆装箱的机制。

当把字面量像对象一样操作的时候,JavaScript 会进行装箱操作。

可以把上面这份理解成下面这份:

var string = '996 say no!';

console.log(typeof string); // :"string"
console.log((new String(string)).length); // :11

其中的 new String 就是装箱操作,String 就是字符串的对象包装器。

这样将成了对象,就能访问到其了。

需要注意的是,对字面量包装后不会原始值,上述例子中的 string 变量的值依然是字符串字面量,不会变成对象,所以每一次对字面量做访问或的操作时,都会做一次装箱操作。
许多开发者会考虑频繁装箱的影响,其实通常是不必要的,一是现在计算机和浏览器的处理执行速度很快了,几乎可以忽略不计装箱的开销,另外就是业务开发中在没有明确的要求下,是不考虑的,以完成业务逻辑为主。

拆箱操作很多时候是隐式转换过程中发生的。

如将字符串进行对象相等操作:

var obj = {
  toString: function() {
    return '996';
  },
};

console.log(
  '996' == obj,
); // :true

上述例子,在字符串字面量 996 和对象 obj 进行比较的时候,会尝试将右侧的对象转化成字符串,即 toString (在 ES6 中则会先看有没有部署 Symbol.toPrimitive )。

这个即使拆箱的过程。

理解对象包装器的作用,可以更好的理解内置对象的用途。


联系我
置顶