JavaScript对象更新行为(很奇怪?)

时间:2018-04-12 08:29:46

标签: javascript

我正在学习Javascript。试图理解代码,

function foo (){
   var a = b = {name: 'Hai'};
   document.write(a.name +'<br>');
   document.write(b.name +'<br>');
    
   a.name = 'Hello';
     
   document.write(a.name +'<br>');
   document.write(b.name +'<br>');
}

输出如下,

海 海
你好
你好

虽然分配从右到左是正确的,但更新会影响两个方向。 这是怎么回事?有人可以解释一下吗?

2 个答案:

答案 0 :(得分:6)

这是因为ab都引用了同一个对象{name: 'Hai'}。当您更改一个时,更改将反映在两个变量中。

var a = b = {name: 'Hai'};

上述陈述基本上与此类陈述相似(除了@NinaScholz在她的回答中指出的内容):

var b = {name: 'Hai'};
a = b;

这样,ab都指向内存中的同一个对象,因此,一个中的更新会自动反映到另一个中。

在文档here中详细了解对象的工作原理。要阅读有关对象和参考的更多信息,请参阅this link

答案 1 :(得分:5)

尝试在一个联合分配中声明变量是一种不好的风格(不起作用),因为内部变量是在全局范围内声明的,而不是局部变量。

function foo (){
   var a = b = {name: 'Hai'};
   document.write(a.name +'<br>');
   document.write(b.name +'<br>');
    
   a.name = 'Hello';
     
   document.write(a.name +'<br>');
   document.write(b.name +'<br>');
}

foo();
console.log(b);

在严格模式下,您会收到错误,因为您在不声明的情况下使用变量。

'use strict';

function foo (){
   var a = b = {name: 'Hai'};
   document.write(a.name +'<br>');
   document.write(b.name +'<br>');
    
   a.name = 'Hello';
     
   document.write(a.name +'<br>');
   document.write(b.name +'<br>');
}

foo();
console.log(b);

真正的执行顺序是

var a = (b = {name: 'Hai'});

首先评估内部表达,然后评估外部分配