js拆箱和装箱
概念
装箱
- 定义:将基本数据类型(如 string/number/boolean)转换为对应的包装对象(如 String/Number/Boolean)。
- 分类:
- a: 当基本类型需要调用方法或访问属性时,JavaScript 引擎自动创建临时包装对象,执行后立即销毁,比如字符串调用
substring方法,需要注意隐式装箱后对象会被销毁,所以添加属性是无效的。 - b: 显式装箱:显式的话就是用
new关键字,比如new String()。
- a: 当基本类型需要调用方法或访问属性时,JavaScript 引擎自动创建临时包装对象,执行后立即销毁,比如字符串调用
// 装箱示例
let a = 10;
let b = new Number(a);
console.log(b); // 输出: [Number: 10]
拆箱
- 定义:将包装对象转换为基本数据类型的过程。
- 分类:
- a: 当需要访问对象的值时,JavaScript 引擎会自动拆箱,比如对象调用
toString方法。 - b: 显式拆箱:显式的话就是用
valueOf方法,比如 Number 对象调用valueOf方法。
- a: 当需要访问对象的值时,JavaScript 引擎会自动拆箱,比如对象调用
// 拆箱示例
const numObj = new Number(10);
console.log(numObj.valueOf()); // 输出: 10
隐式装箱机制
基本类型字符串(如 "Hello")在调用 substring 等方法时,JavaScript 引擎会自动创建临时的 String 包装对象,使基本类型具备对象的行为。方法执行完成后,临时对象立即销毁。
// 方法归属本质
const str = "Hello";
console.log(str.substring === String.prototype.substring); // 输出: true
使用场景
- 装箱:
- 隐式装箱通常发生在调用基本类型的方法或属性时。
- 显式装箱通过构造函数如
new Number()来手动创建对象。
// 装箱的使用场景
const numObj = new Number(10);
numObj.customProp = true;
console.log(numObj.customProp); // 输出: true
- 拆箱:
- 拆箱的使用场景包括访问对象的值、类型转换、条件判断等。
// 拆箱的使用场景
console.log(new Number(1) + 2); // 输出: 3(拆箱后参与计算)
## js 什么场景下使用拆箱,什么场景下使用装箱?
1: 隐式装箱通常发生在调用基本类型的方法或属性时,比如使用字符串的substring方法,这时候JS会自动创建一个临时包装对象,执行完后销毁
2: 显式装箱则是通过构造函数如new Number()来手动创建对象
装箱的使用场景包括调用方法、属性访问、类型判断等。例如,当基本类型需要调用方法时,JS会隐式装箱,如字符串调用substring
显式装箱可能用于需要对象特性的情况,比如使用对象的方法或存储属性
显式操作包装对象时, 需手动创建包装对象以扩展属性或方法!!!
```javascript
const numObj = new Number(10);
numObj.customProp = true;
console.log(numObj.customProp); // 输出 true numObj就会多一个customProp属性
拆箱的使用场景包括访问对象的值、类型转换、条件判断等。例如,当需要访问对象的值时,JS会自动拆箱,如对象调用toString
- 包装对象参与运算时 运算需原始值,触发 valueOf() 或 toString() 拆箱
console.log(new Number(1) + 2); // 输出: 3(拆箱后参与计算)
new Number(1) 和 Number(1) 区别 ?
1: Number是一个函数!!!; Number(1)将1转换为数字类型,而new Number(1)则是将1包装成对象 2:数据类型与返回值 Number(1):返回 基本类型(number),直接表示数值 1 new Number(1):返回 Number 对象(object),是 1 的包装对象 对象实例比较:new 每次生成新对象,引用地址不同 new Number(1) === new Number(1); // false
- Number() 是 JavaScript 的内置函数,用于将其他值转换为数字类型 a: 核心功能:将参数转换为数值类型(number)
总结
Number() 是 JavaScript 的内置函数,主要用于类型转换; 而 new Number() 是其构造函数形式,生成包装对象 ,日常开发中应优先使用函数形式,仅在需要对象特性时选择构造函数
心得:装箱 就是把基本类型转换为对象类型, 为啥转换为对象类型?
因为基本类型没有属性和方法,所以需要转换为对象类型
拆箱就是把对象类型转换为基本类型,为啥转换为基本类型?
因为对象类型有属性和方法,所以需要转换为基本类型,进行运算