前端 - JavaScript中直接给对象赋值和属性赋值有何区别?
高洛峰
高洛峰 2017-04-10 14:53:44
0
3
786

比如下例:

var objA = {
  a:{a1:"a1"},
  b:"b1"
};

var objB = {b1:"b1"};

var c = objA.a;
c = objB;


console.log(objA);

得到的结果是:

 [object Object] {
  a: [object Object] {
    a1: "a1"
  },
  b: "b1"
}

但是下面的程序:

var objA = {
  a:{a1:"a1"},
  b:"b1"
};

var objB = {b1:"b1"};

var c = objA.a;
c.c1 = "c1";


console.log(objA);

得到的结果是:

[object Object] {
  a: [object Object] {
    a1: "a1",
    c1: "c1"
  },
  b: "b1"
}

为什么赋值时是对象就不能成功?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

reply all(3)
伊谢尔伦

第一个你就理解成 c 的指针只是从 objA.a 移给了 objB,移动后 cobjA.a 已没有关系啦,后面的因为两个都是指向同一个对象的原因所以会同时修改。

巴扎黑

第一种情况:c中保存了objA.a的引用,c = objB;只会将c存储的引用改为objB的引用,objA.a是不会受影响的;
第二种情况:c中保存了objA.a的引用,c.c1 = "c1";修改的是objA.a的内存空间,所以会受影响;

Ty80

这个问题的关键在于理解JavaScript的引用赋值问题,楼上公子的指针说法来自于C,虽然更趋于本质,但是放在JavaScript语境下面,略显尖奥了。

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template