Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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 为什么选择这个计划';s的结果未定义?_Javascript - Fatal编程技术网

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;