let a=[1,2,3];
let b = a;
b = [];
console.log(a); // 输出为 [1,2,3]
在这里我想让a成为现在b的值, 就是清空, 请问有什么方法可以, 可以将变量b指向a相同的一个内存空间
let a=[1,2,3]; let b = a; b.length = 0; // 清空 - 并不修改引用 console.log(a); // 输出为 []
厉害,开阔 视野
厉害, 想请问下原理
@Bravo_Jack: 注释就是了。两个变量指向同一块内存区域
@Bravo_Jack: 注释就是了。两个变量指向同一块内存区域。
如果你想通过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其实就是储存变量用的。
谢答!
b=[] 的意思是:创建一个空数组[],把空数组[]的引用 赋值给b。
b在这里更新为[]的引用, 已经不再是[1,2,3]的引用了, 先问下为什么设置length后会影响到[1,2,3]这个object
难道是变量b中存储了两个指针?
@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]的指针(或者说引用)。
b.length等于0是直接清空数组,把任何数组.length=0都可以清空数组,数组属于对象类型,这个复制只是浅拷贝,把引用值赋给另一个了,但是指的同一块堆内存,不同栈内存内存着相同堆内存地址,所以要想对象类型相互影响需要做深拷贝