题目描述
var obj = {arr : [1,2]}
function fn(){};
fn.prototype.count = obj.arr;
var obj2 = obj;
obj.arr = [2,3];
console.log(obj2.arr); //[2,3]
console.log(fn.prototype.count); // [1,2]
为何fn.protorype.count 不是[2,3],这里引用的数组在堆内存里面是同一个呀
var obj = {arr : [1,2]}
function fn(){};
fn.prototype.count = obj.arr;
var obj2 = obj;
obj.arr = [2,3];
console.log(obj2.arr); //[2,3]
console.log(fn.prototype.count); // [1,2]
为何fn.protorype.count 不是[2,3],这里引用的数组在堆内存里面是同一个呀
var obj = {arr : [1,2]}
function fn(){};
fn.prototype.count = obj.arr;
var obj2 = obj;
obj.arr = [2,4]; // 问题在这里, 你这里有是指向一个新的引用
console.log(fn.prototype.count);
这类问题不需要考虑内存什么的,只需要考虑,是否进行了属性操作
。
b引用a对象,只有a的属性变化后,b才会跟着变。如果a直接赋值,不参与属性操作,b是不会变得。
对于 obj.arr = [2,3]
:
1.对obj的属性进行了操作,obj2引用obj。于是obj2变化了。
2.对obj.arr
对象重新进行了赋值,不是obj.arr
对象的属性操作,引用obj.arr
的fn.prototype.count
是不会变的。
要想使fn.prototype.count
变化,操作obj.arr
的属性即可。示例:
//obj.arr = [2,3]改成
obj.arr[0]=2;obj.arr[1]=3
这样操作后:
console.log(fn.prototype.count) //=>[2,3]
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
[] 是数组的字面量表示形式,等价于new Array();因此你上放的代码可以是
这样就可以很明显的看到 obj.arr = new Array(2,3) 其实是重新在堆内存中开辟了一个新的内存空间,它根上面的 arr : [1,2] 是独立的两个对象