【问题标题】:Two assignments in one line [duplicate]一行中的两个作业[重复]
【发布时间】:2015-07-21 09:42:38
【问题描述】:

假设我们从这个开始:

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

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

【问题讨论】:

    标签: javascript var


    【解决方案1】:

    作业确实是从右到左。只是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
                                                                 }
    

    【讨论】:

    • 你怎么知道的?
    • 绝对没有“占位符”对象。
    • 重新阅读您的答案和spec,我注意到您为什么这样做以及我自己的答案中的一个致命缺陷。没有“占位符对象”,而是对内存中对象的属性x引用
    • 通过引用,我的意思是:es5.github.io/#x8.7 -- 见第二段,可能对你的答案有用。
    • @gotnull 该标准声明首先计算左侧表达式:ecma-international.org/ecma-262/5.1/#sec-11.13.1
    【解决方案2】:

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

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

    【讨论】:

    • "但是分配目标评估是从左到右进行的。" ——您使用“评估”的方式具有误导性。如果分配目标是从左到右评估的,那么这将记录 undefined: jsfiddle.net/w8cbhdub
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多