- 装箱:把基本类型转换为对应的引用类型。
- 拆箱:把引用类型转换为基本类型。
装箱
每当我们操作一个基础类型时,后台就会自动创建一个包装类型的对象,从而让我们能够调用一些方法和属性,
如下代码所示:
var name = "jimmy";
var name2 = name.substring(2);
实际上发生了以下几个过程:
- 创建一个
String的对象实例 - 在实例上调用
substring方法 - 销毁实例
也就是说,我们使用基本类型调用方法,就会自动进行装箱操作,相同的,我们使用Number和Boolean类型时,也会发生这个过程。
拆箱
从引用类型到基本类型的转换,也就是拆箱的过程中,会遵循ECMAScript规范规定的toPrimitive原则,一般会调用引用类型的valueOf和toString方法,你也可以直接重写toPeimitive方法。一般转换成不同类型的值遵循的原则不同,例如:
- 引用类型转换为
Number类型,先调用valueOf,再调用toString - 引用类型转换为
String类型,先调用toString,再调用valueOf
若valueOf和toString都不存在,或者没有返回基本类型,则抛出TypeError异常。
let obj = {
valueOf:function(){
console.log("valueOf");
return {};
},
toString:function(){
console.log("toString");
return 'obj';
}
}
console.log(1 + obj);
// valueOf toString obj