JavaScript中装箱和拆箱
文章目录
众所周知,JS 是一门弱类型语言。它不需要事先具体声明变量的类型,因为会在程序运行过程中,类型会被自动推断确定。因此,可以用同一个变量保存不同类型的数据:
var a = 1;
a = 'abc';
a = {
x: 1
};
“装箱”这种说法是来自其他语言的。其实叫啥名字无关紧要,主要是理解这个过程,不再迷糊。
装箱
当读取/调用一个基本类型时,会创建它的基本包装类型。
隐式装箱
例如:
var str = ‘abc’;//string
str.substring();//string=>String=>String.function=>string
当代码执行到第二行时,会对str进行装箱操作:
- str被认为是字符串,所以进行
String
装箱,new String('abc')
。 - 调用
String
的substring
方法。 - 销毁这个
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 基本的数据类型