(转载)javascript中的装箱和拆箱

装箱

基本数据类型 转换为对应的 引用类型 的操作称为 装箱,把 引用类型 转换为 基本数据类型 称为 拆箱

每当读取一个基本类型的时候,后台就会创建一个对应的基本包装类型对象,从而让我们能够调用一些方法来操作这些数据。 –《javascript 高级程序设计》

1
2
var s1 = 'some text';
var s2 = s1.substring(2);

如上所视,变量 s1 是一个基本类型值,它不是对象,所以它不应该有方法。但是 js 内部为我们完成了一系列处理(即我们称之为装箱),使得它能够调用方法,实现的机制如下:

  • 创建 String 类型的一个实例
  • 在实例上调用指定的方法
  • 销毁这个实例

这个过程也可以用代码来展现:

1
2
3
var s1 = new String('some text');
var s2 = s1.substring(2);
s1 = null;

我在很多地方都看到过说装箱操作会泄露内存,可是这里明明是销毁了实例的,哎,我还是相信《javascript 高级程序设计》吧,认为它不会泄露~

拆箱

引用类型 对象转换为对应的 基本数据类型,它是通过 引用类型valueOf() 或者 toString() 方法来实现的。如果是自定义的对象,你也可以自定义它的 valueOf()/tostring() 方法,实现对这个对象的 拆箱

1
2
3
4
5
6
7
8
9
10
var objNum = new Number(123);
var objStr = new String('123');

console.log(typeof objNum); //object
console.log(typeof objStr); //object

console.log(typeof objNum.valueOf()); //number
console.log(typeof objStr.valueOf()); //string
console.log(typeof objNum.toString()); // string
console.log(typeof objStr.toString()); // string