自动装箱现象
js提供了3种特殊的引用类型(基本包装类型):Number Boolean String
每当读取一个基本类型数据时,后台就会创建一个对应的基本包装类型的对象,从而使得我们可以调用一些方法来操作数据:
1 | let str='hello world'; |
基本数据类型不是对象,为什么能拥有并使用方法呢。这是因为对于上述例子,后台进行了一系列的处理:
- 创建String类型的一个实例;
- 在实例上调用指定的方法;
- 销毁这个实例
可以理解为上述代码实例经历了这样一个过程:上述3个步骤也适用于Number和Boolean1
2
3let str=new String('hello world');
let newStr=str.substr(2, 2);
str =null;
引用类型和基本包装类型的区别
两者区别主要在于对象的生存期。使用new操作符创建的引用类型实例,在执行流离开当前作用域之前都一直保存在内存中。而自动创建的基本包装类型的对象只存在于访问它的那行代码执行期间,随即便被销毁。这意味着我们不能在运行时为基本类型值添加属性和方法。
自动拆箱现象
1 | console.log('hello world' == new String('hello world'));//true |
在上面这行代码中,使用==运算符,发生了隐式转换。String实例对象转换为了基本数据类型string,这就是一个拆箱过程。