JS中的拆箱和装箱

114 阅读1分钟
  • 包装类与原始值转换过程叫做「装箱」和「拆箱」,装箱是将值类型包装为对象类型,拆箱是将对象类型转换为值类型。

为部分基础类型系统中的“值类型”设定对应的包装类,通过包装类,将“值类型数据”作为对象来处理

packback.png

显式装箱

  • 显式创建,通过基本包装类型对象对基本类型进行显示装箱。

例如:new Number(3) // Number{3}

隐式装箱

var s1 = 'call_me_R'; // 隐式装箱 
var s2 = s1.substring(2);

上面代码的执行步骤其实是这样的:

  1. 创建String类型的一个实例;
  2. 在实例中调用制定的方法;
  3. 销毁这个实例

隐式装箱当读取一个基本类型值时,后台会创建一个该基本类型所对应的基本包装类型对象。在这个基本类型的对象上调用方法,其实就是在这个基本类型对象上调用方法。这个基本类型的对象是临时的,它只存在于方法调用那一行代码执行的瞬间,执行方法后立即被销毁。这也是在基本类型上添加属性和方法会不识别或报错的原因了。

var s1 = 'call_me_R';
s1.job = 'frontend engineer';
s1.sayHello = function(){
	console.log('hello kitty');
}
console.log(s1.job); // undefined
s1.sayHello(); // Uncaught TypeError: s1.sayHello is not a function。

拆箱操作

拆箱是指把引用类型转换成基本的数据类型。通常通过引用类型的valueOf()或toString()方法来实现。

在下面的代码中,留意下valueOf()和toString()返回值的区别:

var objNum = new Number(64);
var objStr = new String('64');
console.log(typeof objNum); // object
console.log(typeof objStr); // object
// 拆箱
console.log(typeof objNum.valueOf()); // number
console.log(typeof objNum.toString()); // string
console.log(typeof objStr.valueOf()); // string 
console.log(typeof objStr.toString()); // string