js 赋值问题

题目描述

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],这里引用的数组在堆内存里面是同一个呀

阅读 2.4k
3 个回答

[] 是数组的字面量表示形式,等价于new Array();因此你上放的代码可以是

var obj = {arr : [1,2]}
function fn(){};
fn.prototype.count = obj.arr;
var obj2 = obj;
obj.arr = new Array(2,3); 
console.log(obj2.arr);    //[2,3]
console.log(fn.prototype.count);    //   [1,2]

这样就可以很明显的看到 obj.arr = new Array(2,3) 其实是重新在堆内存中开辟了一个新的内存空间,它根上面的 arr : [1,2] 是独立的两个对象

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.arrfn.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]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题