装箱
- 先说结论,在JavaScript中装箱(boxing)是指将基本数据类型自动或显示地转换为对应的对象包装类型的过程,目的是为了能让基本数据类型也可以使用对象的方法和属性。
基本类型与包装对象 JavaScript 有 7 种基本类型:string, number, bigint, boolean, null, undefined, symbol。
它们本身不是对象,但都有对应的包装对象:
String 对应 string
Number 对应 number
Boolean 对应 boolean
BigInt 对应 bigint
Symbol 对应 symbol
自动装箱:
当我们试图访问基本数据类型的属性或方法时,自动装箱就会被触发,JavaScript会临时创建一个对应的包装对象,操作完成后立即丢弃。
const str = "hello";
console.log(str.toUpperCase()); // "HELLO"
// 相当于临时执行:
const tempStr = new String(str);
tempStr.toUpperCase();
tempStr = null; // 临时对象会被销毁
特点:
1.临时性:包装对象仅在访问属性或方法时存在,操作结束后立即被垃圾回收。
2.不可变性:给基本数据类型添加属性会失败。
显示装箱:即通构造函数手动创建包装对象
const strObj = new String("hello");
const numObj = new Number(68);
const boolObj = new Boolean(true);
特点:
包装对象是真正的对象,typeof 返回 "object"。
console.log(typeof new String("abc")); // "object"
console.log(typeof "abc"); // "string"
拆箱:
通过 valueOf() 方法可以将包装对象转换回基本类型:
const numObj = new Number(68);
console.log(numObj.valueOf()); // 68(number 类型)
注意事项
- 避免显式装箱:大多数情况下直接使用基本类型即可,显式创建包装对象可能导致意外行为
- 类型检测:使用
===严格比较时,基本类型与包装对象不相等
console.log(new String("abc") === "abc"); // false
- 虽然自动装箱有微小性能开销,但在现代引擎中优化得很好,一般无需担心