作为对象引用的变量不起作用

时间:2018-06-10 22:57:53

标签: javascript

var a = {};
var b = a;
b.c = "whatever";

console.log(a.c) // whatever. 

按预期工作,可以通过b更新;


var a = {};
var b = a;
b = "whatever";

console.log(a) // {}
console.log(b) // whatever

无法按预期工作。 a未按b 更新

更新问题:是否只能通过引用更新对象属性?不是对象本身?

3 个答案:

答案 0 :(得分:2)

这是他们的值存储在内存中的方式:

  

第一种方法

         +-----+------+
Variable |  a  |   b  |
         +-----+---|--+
   Value | {}  |<--+  | //'b' points to 'a', so every change (to the object) 
         +-----+------+ // in 'b' will modify 'a'.
  

第二种方法

         +-----+---------+
Variable |  a  |   b     |
         +-----+---|-----+
   Value | {}  |<--+     | //First assignment.
         +-----+---------+
   Value | {}  | Whatever| //Second assignment.  So, you're only assigning a new    
         +-----+---------+ //value to 'b' and not modifying the previous  
                           //value (properties/fields) from 'a'.

答案 1 :(得分:1)

请查看有关Explaining Value vs Reference in Javascript

的这篇文章

当你这样做时,你已经覆盖了参考文献:

 b = "whatever";

执行此操作时,b不再指向a。现在,b拥有自己的价值。您可以更新b引用的对象的属性,如示例所示:

b.c = "whatever";

答案 2 :(得分:1)

通过声明b = "whatever";,您已将参数b重新分配(抱歉我不知道确切的术语,因此我称之为&#39;引用&#39;)变量{{ 1}},在其中包含值a的{​​{1}}。

重要的是要知道JavaScript在变量赋值方面是灵活的,就像今天的大多数现代高级编程语言一样,因为它不仅允许您更改先前声明的变量的值,还可以更改数据该指定变量的类型,例如:

string

因此,如果您不小心分配变量,则可以非常轻松地创建错误,类似于您在第二种方法中表达的错误。