包装对象

388 阅读1分钟

1. 问题引入

var a = '1';
console.log(a.length) // 1

a.length = 0;
console.log(a.length) // 1

两个问题

  1. a是一个字符串,属于值类型,并不是一个对象,为什么会有length属性?
  2. 我将a.length改为0没有报错,为什么再次访问却仍是1呢?

2. 包装对象

这两个问题都牵扯到一个概念,那就是包装对象。
当访问stringnumberboolean这三种值类型的属性或方法时,

  1. js会先根据值转化为相应的对象,这个对象就是传说中的包装对象,
  2. 然后我们访问的都是这个包装对象,
  3. 处理完成之后,销毁这个包装对象。

console.log(a.length); 相当于

var _a = new String(a); // 根据值创建包装对象
console.log(_a.length); // 访问包装对象
_a = null; // 销毁

a.length = 0; 相当于

var _a = new String(a); //创建
_a.length = 0; // 访问
_a = null; // 销毁

所以再次访问a.length时,仍返回1;

注意:其实在实现上并不一定创建或销毁这个临时对象,然而整个过程看起来是这样。 我们可以这么理解js的处理过程,但是这并不一定是真正的处理。

参考文献

  1. JavaScript权威指南