一行中的两个作业

时间:2015-05-11 01:03:11

标签: javascript var

假设我们从这开始:

var foo = {n:1}; var bar = foo;

在JavaScript中,执行以下分配的顺序是什么:

foo.x = foo = {n:2};

当我查找答案时,我发现有几个似乎表明任务从右到右发生,例如:

foo = {n:2}; foo.x = foo;

我们希望在哪种情况下:

console.log(foo) //{n:2, x:Object} - (a circular reference back to foo)

然而,当我实际执行此操作时,我在控制台中看到的内容表明分配实际上是从左到右:

console.log(foo) //{n:2} console.log(bar) //{n:1, x:Object} - > {n:1} obj获取'x'属性,foo被重新分配给新对象{n:2}

当一行中有多个作业时,有人可以向我澄清操作的顺序吗?

此外,将上述情况与以下情况区分开来的基本规则是什么: Multiple variable assignments in one row

上述问题中的一些答案声称原语的分配是在左边进行的......

2 个答案:

答案 0 :(得分:12)

作业确实从右到左。只是foo.x的分辨率在分配之前发生。 (Ecma Standard 11.13.1 Simple Assignment

这样想。在分配之前,foobar碰巧指向内存中的同一个对象。 (我们称之为inMemoryObject)。

foo --|
bar --|
      |---> inMemoryObject { 
                               n:1 
                           }

然后我们在赋值方法的开头引用foo.x。由于foo.x不存在,因此会创建占位符,准备将其分配给。

foo --|
bar --|
      |---> inMemoryObject { 
                               n:1, 
                               x: undefined 
                           }

创建变量后,从右到左分配过程开始,分配给inMemoryObject.x。在分配流程结束时,foo不再指向inMemoryObject,但bar仍然指向bar --| |---> inMemoryObject { n:1, x: --| foo --| } | | | |----------------------------|--- secondInMemoryObject { n:2 }

primaryStage.setScene(...)

答案 1 :(得分:1)

分配从右到左发生,但分配目标评估从左到右进行。

基本上整个表达式从左到右开始计算,但实际的赋值需要右侧的返回值。因此,在重新评估右侧评估的价值之后,必须进行分配。