Skip to content
快看这页儿写了啥...

介绍基本数据类型的封箱与拆箱?

题干

  • 封箱与拆箱

题解

  • 封箱、装箱就是把基本数据类型转换为对应的引用数据类型(也就是内置对象)的操作。

  • 拆箱就是把引用数据类型转换为基本数据类型的操作。

JS 中有 7 种基本数据类型,它们不是对象,不能调用方法或属性。但是有时候我们可以看到像这样的代码:

js
var s = "hello";
console.log(s.length); // 5

这里的 s 是一个字符串,它怎么能调用 length 属性呢?这就涉及到了装箱和拆箱的操作。

封箱、装箱就是把基本数据类型转换为对应的引用数据类型(也就是内置对象)的操作。

当我们读取或操作一个基本类型的值时,JS 会在后台自动创建一个对应的基本包装类型对象(比如 StringNumberBoolean),让我们能够调用一些方法或属性来处理这些数据。这个过程叫做 隐式装箱

🌰:

js
var s = "hello";
console.log(s.length); // 5
// 相当于
var s = new String("hello");
console.log(s.length); // 5
s = null;

我们也可以手动地创建基本包装类型对象,这叫做 显式装箱

🌰:

js
var n = new Number(123);
console.log(n.toFixed(2)); // 123.00

但注意,基本包装类型对象和基本类型的值是不一样的。前者是对象,后者是原始值。它们在比较、赋值、类型判断等方面有不同的表现。

🌰:

js
var s1 = "hello";
var s2 = new String("hello");
console.log(typeof s1); // string
console.log(typeof s2); // object
console.log(s1 == s2); // true
console.log(s1 === s2); // false

拆箱就是把引用数据类型转换为基本数据类型的操作。

它通常发生在需要进行运算或比较的时候,JS 会自动调用引用数据类型的 valueOf()toString() 方法来得到一个基本类型的值。

🌰:

js
var n = new Number(123);
console.log(n + 1); // 124
// 相当于
console.log(n.valueOf() + 1); // 124

var s = new String("hello");
console.log(s > "a"); // true
// 相当于
console.log(s.toString() > "a"); // true

总之,装箱和拆箱是 JS 为了方便我们处理不同类型的数据而提供的一种机制,它们大多数时候是隐式地进行的,我们不需要关心细节。但是有时候也要注意它们可能带来的一些问题,比如类型判断、性能开销等。

相关

{} 和 [] 的 valueOf 和 toString 结果是什么

贡献者

isboyjc's avatar isboyjc

浏览量(PV)  次  ·  独立访客(UV)  人次
不正经的前端 | 八股 · 欢迎 star ⭐