我正在学习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>');
}
输出如下,
海
海
你好
你好
虽然分配从右到左是正确的,但更新会影响两个方向。 这是怎么回事?有人可以解释一下吗?
答案 0 :(得分:6)
这是因为a
和b
都引用了同一个对象{name: 'Hai'}
。当您更改一个时,更改将反映在两个变量中。
var a = b = {name: 'Hai'};
上述陈述基本上与此类陈述相似(除了@NinaScholz在她的回答中指出的内容):
var b = {name: 'Hai'};
a = b;
这样,a
和b
都指向内存中的同一个对象,因此,一个中的更新会自动反映到另一个中。
答案 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'});
首先评估内部表达,然后评估外部分配