【问题标题】:JavaScript object update behavior (weird ?)JavaScript 对象更新行为(奇怪?)
【发布时间】:2018-04-12 08:29:45
【问题描述】:

我正在学习 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>');
}

输出如下,

海
海
你好
你好

虽然分配确实是从右到左,但更新对两个方向都有影响。 这是它的工作原理吗?有人可以解释一下吗?

【问题讨论】:

  • 在javascript中,对象和数组是通过引用传递的。

标签: javascript


【解决方案1】:

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

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

上面的陈述本质上与这个相似(除了@NinaScholz 在她的回答中指出的):

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

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

在文档here 中了解有关对象如何工作的更多信息。要了解有关对象和引用的更多信息,请参阅this link。

【讨论】:

  • 顺序有点不同,因为先分配b,然后分配a。这需要声明变量b 或在非严格模式下,变量通过使用全局声明。
【解决方案2】:

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

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'});

先计算内部表达式,然后计算外部赋值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-14
    • 2023-03-17
    • 2017-11-20
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多