Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[js] 第745天 请解释下什么是js的装箱和拆箱? #3882

Open
haizhilin2013 opened this issue Apr 29, 2021 · 2 comments
Open

[js] 第745天 请解释下什么是js的装箱和拆箱? #3882

haizhilin2013 opened this issue Apr 29, 2021 · 2 comments
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

第745天 请解释下什么是js的装箱和拆箱?

3+1官网

我也要出题

@haizhilin2013 haizhilin2013 added the js JavaScript label Apr 29, 2021
@hikerw
Copy link

hikerw commented Apr 30, 2021

1,装箱:
把基本数据类型转换为对应的引用类型的操作称为装箱,把引用类型转换为基本的数据类型称为拆箱。
在《javascript高级程序设计》中有这样一句话:
1
每当读取一个基本类型的时候,后台就会创建一个对应的基本包装类型对象,从而让我们能够调用一些方法来操作这些数据。
var s1 = "some text";
var s2 = s1.substring(2);
如上所视,变量s1是一个基本类型值,它不是对象,所以它不应该有方法。但是js内部为我们完成了一系列处理(即我们称之为装箱),使得它能够调用方法,实现的机制如下:
(1)创建String类型的一个实例;
(2)在实例上调用指定的方法;
(3)销毁这个实例;
这个过程也可以用代码来展现:
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
我在很多地方都看到过说装箱操作会泄露内存,可是这里明明是销毁了实例的,哎,我还是相信《javascript高级程序设计》吧,认为它不会泄露,如果你有见解,请留言!
2,拆箱:
将引用类型对象转换为对应的值类型对象,它是通过引用类型的valueOf()或者toString()方法来实现的。如果是自定义的对象,你也可以自定义它的valueOf()/tostring()方法,实现对这个对象的拆箱。
1 var objNum = new Number(123);
2 var objStr =new String("123");
3
4 console.log( typeof objNum ); //object
5 console.log( typeof objStr ); //object
6
7 console.log( typeof objNum.valueOf() ); //number
8 console.log( typeof objStr.valueOf() ); //string
9 10 console.log( typeof objNum.toString() ); // string
11 console.log( typeof objStr.toString() ); // string

@cielaber
Copy link

装箱:原始数据类型转换成引用类型,如对原始类型进行对象的特有操作,new创建原始类型等。
拆箱:引用类型转换成原始类型,如对复杂类型进行valueOf和toString操作。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests

3 participants