使用JavaScript的多个左手赋值,真的是右关联吗?
在这篇文章中,@Crescent-Fresh说JavsScript左手赋值是右联想的。但在我看来,以下代码似乎破坏了正确的关联性:使用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 =
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和脚本之间没有空格