js装箱和拆箱

75 阅读4分钟

js拆箱和装箱

概念

装箱

  • 定义:将基本数据类型(如 string/number/boolean)转换为对应的包装对象(如 String/Number/Boolean)。
  • 分类
    • a: 当基本类型需要调用方法或访问属性时,JavaScript 引擎自动创建临时包装对象,执行后立即销毁,比如字符串调用 substring 方法,需要注意隐式装箱后对象会被销毁,所以添加属性是无效的。
    • b: 显式装箱:显式的话就是用 new 关键字,比如 new String()
// 装箱示例
let a = 10;
let b = new Number(a);
console.log(b); // 输出: [Number: 10]

拆箱

  • 定义:将包装对象转换为基本数据类型的过程。
  • 分类
    • a: 当需要访问对象的值时,JavaScript 引擎会自动拆箱,比如对象调用 toString 方法。
    • b: 显式拆箱:显式的话就是用 valueOf 方法,比如 Number 对象调用 valueOf 方法。
// 拆箱示例
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

  1. 包装对象参与运算时 运算需原始值,触发 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

  1. Number() 是 JavaScript 的内置函数,用于将其他值转换为数字类型 a: 核心功能:将参数转换为数值类型(number)

总结

Number() 是 JavaScript 的内置函数,主要用于类型转换; 而 new Number() 是其构造函数形式,生成包装对象 ,日常开发中应优先使用函数形式,仅在需要对象特性时选择构造函数

心得:装箱 就是把基本类型转换为对象类型, 为啥转换为对象类型?

因为基本类型没有属性和方法,所以需要转换为对象类型

拆箱就是把对象类型转换为基本类型,为啥转换为基本类型?

因为对象类型有属性和方法,所以需要转换为基本类型,进行运算