以下语句的运行顺序是什么?运行时是从右到左执行它吗?
length = i = test = output = null;
答案 0 :(得分:6)
是的,因为assignment expression本身不是lefthand-side expression,所以嵌套是
(length = (i = (test = (output = null))));
从外向内执行,从左到右解决引用(首先获取length
变量,然后评估右侧,即获取i
变量并评估...)。这意味着output
是第一个被分配到的变量,然后是test
,然后是i
,最后是length
:“从右到左”,如果您愿意的话。由于赋值运算符总是产生其右操作数,因此将为所有内容分配相同的(最里面的,最右边的)值:null
。
答案 1 :(得分:3)
运行时是否从右向左执行它?
是
foo = {
set a() {
console.log('a');
},
set b() {
console.log('b');
},
set c() {
console.log('c');
},
set d() {
console.log('d');
}
};
foo.a = foo.b = foo.c = foo.d = 'bar';
产生
d
c
b
a
在控制台中。此顺序是必需的,因为每个赋值都依赖于先前赋值的返回值:
foo.a = foo.b = foo.c = foo.d = 'bar';
相当于:
foo.a = (foo.b = (foo.c = (foo.d = 'bar')));
然而 并不等同于 :
foo.d = 'bar';
foo.c = foo.d;
foo.b = foo.c;
foo.a = foo.b;
a = b
的返回值为b
。如果您选择实现访问器和更改器,这一点尤为重要。
这意味着我之前的示例等同于:
foo.d = 'bar';
foo.c = 'bar';
foo.b = 'bar';
foo.a = 'bar';
答案 2 :(得分:2)
是的,它从右到左执行。 一切的价值现在都是空的。
答案 3 :(得分:1)
该单行分配等同于此
output = null;
test = output;
i = test;
length = i;