Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript的多个左手赋值,真的是右关联吗?_Javascript - Fatal编程技术网

使用JavaScript的多个左手赋值,真的是右关联吗?

使用JavaScript的多个左手赋值,真的是右关联吗?,javascript,Javascript,在这篇文章中,@Crescent-Fresh说JavsScript左手赋值是右联想的。但在我看来,以下代码似乎破坏了正确的关联性: var a = {n: 1}; a.x = a = {n: 2}; console.log(a.x);// undefined 有人能解释为什么a.x没有定义吗 编辑:上面的代码片段是为了测试“正确的关联性”,在现实世界中,请不要编写类似的代码。它是正确的关联性。只是标识符a在语句执行之前绑定到引用 我们可以通过以下几点来证明这一点: var a, b; a =

在这篇文章中,@Crescent-Fresh说JavsScript左手赋值是右联想的。但在我看来,以下代码似乎破坏了正确的关联性:

var a = {n: 1};
a.x = a = {n: 2};
console.log(a.x);// undefined
有人能解释为什么
a.x
没有定义吗


编辑:上面的代码片段是为了测试“正确的关联性”,在现实世界中,请不要编写类似的代码。

它是正确的关联性。只是标识符
a
在语句执行之前绑定到引用

我们可以通过以下几点来证明这一点:

var a, b;
a = b = { n: 1 };
a.x = a = {n: 2};  // a.x refers to the x property of the value a references
                   //     before this statement executes
console.log(a);    // {n: 2}
console.log(b);    // {n: 1, x: {n: 2}}
如果
=
是左关联的,
b.x
将是执行第三行后返回到
b
的循环引用,但它不是


有人能解释为什么a.x是未定义的吗

是的,这是当行
a.x=a={n:2}
执行时发生的情况:

  • {n:2}
    被分配给变量
    a
  • {n:2}
    被分配给
    a
    在语句开始执行之前引用的对象的
    x
    属性

  • 没有为
    a
    的新值的
    x
    属性赋值。这就是为什么
    a.x
    未定义的

    tl;dr-JS在计算出该值之前先计算出该值的位置,计算出该值的副作用会更改
    a
    的值


    第1步是“让lref成为计算LeftHandSideExpression的结果。”

    第2步是“让rref成为赋值表达式求值的结果。”

    因此发生的第一件事是在
    a
    中存储的对象上创建一个属性
    x
    (其中n是1)

    然后计算右侧(最终用新对象覆盖
    a
    ,其中n为2)

    然后将该表达式的结果(其中n为2的对象)指定给原始对象(其中n为1)上的
    x

    您可以通过以下方式看到这一点:

    “严格使用”;
    变量a={n:1};
    var b=a;
    a、 x=a={n:2};
    控制台日志(a);
    
    控制台日志(b)对象通过引用传递。它们从不被复制

    var a = {n:1}
    
    因此,前面的一个对象具有一个属性n=1的引用

    关于第二个陈述
    a.x=a={n:2}
    a、 x在其值为属性n=2的对象的上一个对象上添加了属性x
    同一语句为新对象指定了一个引用。

    循环引用,
    a.x=a
    @Tushar Nope,请在chrome控制台中亲自尝试@尤慕李 第一个赋值
    a.x=a
    被第二个赋值
    a={n:2}删除/覆盖@Tushar-不,不是。回到问题上来-为什么让生活变得困难-简单的任务链接可以。。除此之外,@JLRishe和Quentin的回答都是正确的(想想审查人员和维护人员),但是stackoverflow只允许接受一个答案:(.我对两者都投了赞成票,并接受了后者,因为使用动作引用的答案更为可靠和令人信服。谢谢您,先生。对于js引用,这里是Axel Rauschmayerjavascript博士的一篇优秀文章。注意java和脚本之间没有空格