拆箱\装箱

98 阅读1分钟
  • 装箱:把基本类型转换为对应的引用类型。
  • 拆箱:把引用类型转换为基本类型。

装箱

每当我们操作一个基础类型时,后台就会自动创建一个包装类型的对象,从而让我们能够调用一些方法和属性,

如下代码所示:

var name = "jimmy";
var name2 = name.substring(2);

实际上发生了以下几个过程:

  • 创建一个String的对象实例
  • 在实例上调用substring方法
  • 销毁实例

也就是说,我们使用基本类型调用方法,就会自动进行装箱操作,相同的,我们使用NumberBoolean类型时,也会发生这个过程。

拆箱

从引用类型到基本类型的转换,也就是拆箱的过程中,会遵循ECMAScript规范规定的toPrimitive原则,一般会调用引用类型的valueOftoString方法,你也可以直接重写toPeimitive方法。一般转换成不同类型的值遵循的原则不同,例如:

  • 引用类型转换为Number类型,先调用valueOf,再调用toString
  • 引用类型转换为String类型,先调用toString,再调用valueOf

valueOftoString都不存在,或者没有返回基本类型,则抛出TypeError异常。

let obj = {
	valueOf:function(){
  	console.log("valueOf");
    return {};
  },
  toString:function(){
  	console.log("toString");
    return 'obj';
  }
}
console.log(1 + obj);
// valueOf toString obj