JavaScript中装箱和拆箱是什么?

JavaScript中装箱和拆箱

  众所周知,JS 是一门弱类型语言。它不需要事先具体声明变量的类型,因为会在程序运行过程中,类型会被自动推断确定。因此,可以用同一个变量保存不同类型的数据:

var a = 1;
a = 'abc';
a = {
  x: 1
};

  “装箱”这种说法是来自其他语言的。其实叫啥名字无关紧要,主要是理解这个过程,不再迷糊。

装箱

  当读取/调用一个基本类型时,会创建它的基本包装类型

隐式装箱

例如:

var str = ‘abc’;//string
str.substring();//string=>String=>String.function=>string

  当代码执行到第二行时,会对str进行装箱操作:

  1. str被认为是字符串,所以进行String装箱,new String('abc')
  2. 调用Stringsubstring方法。
  3. 销毁这个String对象。

以上步骤仅存在于调用的一瞬间,用完即毁。
以下是证明:

String.prototype.toString = (str)=>{
    console.log('调用了String.prototype的toString');
    return String.toString(str);
};
console.log(typeof new String('abc'));//object
console.log(typeof 'abc');//string

new String('abc').toString();//调用了String.prototype的toString
'abc'.toString();//调用了String.prototype的toString

显式装箱

  这是通过基本包装类型对象对基本类型进行显示装箱

var name = new String('call_me_R');

  显示装箱的操纵可以对new出来的对象进行属性和方法的添加,因为通过new操作符创建的引用类型的实例,在执行流离开当前作用域之前一直保留在内存中。

var objStr = new String('call_me_R');
objStr.job = 'frontend engineer';
objStr.sayHi = function(){
	console.log('hello kitty');
}
console.log(objStr.job); // frontend engineer
objStr.sayHi(); // hello kitty

拆箱

  顾名思义,拆箱和装箱互为反向操作。拆箱是指把引用类型转换成基本的数据类型。通常通过引用类型的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 基本的数据类型
发布了122 篇原创文章 · 获赞 25 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/HuoYiHengYuan/article/details/104623046