首页 新闻 会员 周边 捐助

JavaScript让一个变量影响另一个变量内容

0
悬赏园豆:50 [已解决问题] 解决于 2020-11-03 18:04
let a=[1,2,3];
let b = a;
b = [];
console.log(a); // 输出为 [1,2,3]

在这里我想让a成为现在b的值, 就是清空, 请问有什么方法可以, 可以将变量b指向a相同的一个内存空间

Bravo_Jack的主页 Bravo_Jack | 初学一级 | 园豆:64
提问于:2020-10-30 00:28
< >
分享
最佳答案
1
let a=[1,2,3];
let b = a;
b.length = 0; // 清空 - 并不修改引用
console.log(a); // 输出为 []
收获园豆:40
幻天芒 | 高人七级 |园豆:37207 | 2020-10-30 01:26

厉害,开阔 视野

winds_随风 | 园豆:156 (初学一级) | 2020-10-30 11:17

厉害, 想请问下原理

Bravo_Jack | 园豆:64 (初学一级) | 2020-10-30 23:00

@Bravo_Jack: 注释就是了。两个变量指向同一块内存区域

幻天芒 | 园豆:37207 (高人七级) | 2020-10-30 23:53

@Bravo_Jack: 注释就是了。两个变量指向同一块内存区域。

幻天芒 | 园豆:37207 (高人七级) | 2020-10-30 23:56
其他回答(2)
0

如果你想通过b操作a,有一个前提,就是操作b的引用。
楼上的b.length=0,是正确用法。

let a=[1,2,3]的意思是:创建一个数组[1,2,3],然后把这个数组的引用 赋值给 a。
let b=a 的意思是:把a的值,即[1,2,3]的引用,赋值给b。
b=[] 的意思是:创建一个空数组[],把空数组[]的引用 赋值给b。

所以你可以发现,b=[]之后,a和b的值,是不同数组的引用。你操作b自然没有效果。

而b.length=0 意思是,将 b的值中一个属性length设置为0,即 数组[1,2,3]的属性length设置为0,就可以清空[1,2,3]。
此时a和b的值,为同一个数组。

这里面的关键是,你要理解,代码中的a,b其实就是储存变量用的。

收获园豆:10
南语喃 | 园豆:306 (菜鸟二级) | 2020-10-30 10:31

谢答!

b=[] 的意思是:创建一个空数组[],把空数组[]的引用 赋值给b。

b在这里更新为[]的引用, 已经不再是[1,2,3]的引用了, 先问下为什么设置length后会影响到[1,2,3]这个object

难道是变量b中存储了两个指针?

支持(0) 反对(0) Bravo_Jack | 园豆:64 (初学一级) | 2020-10-30 23:00

@Bravo_Jack:
let a=[1,2,3];
let b = a;
b.length = 0;

此时b储存的是[1,2,3]的引用,你操作b.length=0,实际就是[1,2,3].length=0。
变量b只储存一个指针,那就是[1,2,3]的指针(或者说引用)。

支持(0) 反对(0) 南语喃 | 园豆:306 (菜鸟二级) | 2020-10-31 13:39
0

b.length等于0是直接清空数组,把任何数组.length=0都可以清空数组,数组属于对象类型,这个复制只是浅拷贝,把引用值赋给另一个了,但是指的同一块堆内存,不同栈内存内存着相同堆内存地址,所以要想对象类型相互影响需要做深拷贝

佛系小萌新 | 园豆:210 (菜鸟二级) | 2021-04-02 21:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册