Javascript 为什么选择这个计划';s的结果未定义?
为什么结果没有定义?Javascript 为什么选择这个计划';s的结果未定义?,javascript,Javascript,为什么结果没有定义? 我以为应该是“[object object]”奇怪的事情正在这里发生: 首先解析tofoo.c并指向旧的foo对象,然后对内部表达式求值,其中foo被重新分配{}emtpy对象文本。所以你的代码相当于 foo.c = (foo = {}) 你也可以试试 var foo1 = {}; var foo2 = {}; foo1.c = foo2; console.log(foo2.c) // obviously undefined now JavaScript引擎拆分此类分配
我以为应该是“[object object]”奇怪的事情正在这里发生: 首先解析to
foo.c
并指向旧的foo
对象,然后对内部表达式求值,其中foo
被重新分配{}
emtpy对象文本。所以你的代码相当于
foo.c = (foo = {})
你也可以试试
var foo1 = {};
var foo2 = {};
foo1.c = foo2;
console.log(foo2.c) // obviously undefined now
JavaScript引擎拆分此类分配:
var foo = {}, old = foo;
foo.c = foo = {};
console.log(old, foo, old.c===foo); // {c:{}}, {}, true
详情如下:
a = b = c = 1;
而不是:
有一个细微但重要的区别——主要涉及getter,请查看更多详细信息——这就是为什么代码的行为与预期不符的主要原因,因为最初的预期基于错误的假设。对象是通过引用传递的。因此
foo.c==foo=={}
。空对象没有属性c
@elclars你是说=
而不是=
?我的意思是它们是同一个对象,它是循环引用。它必须是var foo={};foo.c=foo;控制台日志(foo.c)代码>//这样行吗?因为您正在清空fooYes,或者var foo={};foo.c=foo={c:foo}但是不是foo.c=foo={}中从右到左的求值顺序代码>?i、 e.foo
首先变为{}
,然后将结果分配给foo.c
?@techfoobar:因为它是从外到内,从左到右的。只有运算符的优先级是从右向左。@techfoobar-根据,赋值的左侧在计算右侧之前被解析。因此,foo.c
就像Bergi描述的那样,在评估右侧(涉及另一项任务)之前得到了解决。也许我很奇怪,但深入规范并弄清楚这些事情很有趣:)干得好!事实上,这是不正确的。该语句的计算结果为a=(b=(c=1))代码>。所以赋值c=1
首先发生,它的结果(1
)被赋值到b
,等等。我在想一个好方法来证明这一点。这不是真的@FelixKling。请检查上面链接的我的答案,你会发现一段代码,演示JavaScript引擎在这种特定情况下是如何工作的。这个链接实际上证实了我的说法。你检查过变量的顺序了吗?我不明白你现在为什么要说别的:)说清楚点:我不是说分配的值,我是说分配的顺序。单凭这一点并不能解释OP所获得的输出。我不是在说别的也许有误解,我只是说a=b=1
不等于b=1,a=b
,而是a=1,b=1
。这是众所周知的JavaScript行为——我正在研究spidermonkey。是的,我理解这一点。但是在这个答案中,你声称a
首先得到一个值,然后b
然后c
,而反过来,就像你在另一个答案中写的那样。所以,a=b=1
是b=1,a=1
,而不是a=1,b=1
。订单在这里很重要。因为它意味着foo.c=foo={}
相当于foo={};foo.c={}
,这并不能解释为什么console.log(foo.c)
显示未定义的。
a = b = c = 1;
a = 1;
b = 1;
c = 1;
c = 1;
b = c;
a = b;