var var1 = 1,
var2 = 1,
var3 = 1;
这等价于:
var var1 = var2 = var3 = 1;
我很确定这是变量定义的顺序:var3, var2, var1,这相当于:
var var3 = 1, var2 = var3, var1 = var2;
有什么方法可以在JavaScript中确认这一点吗?可能使用一些分析器?
var var1 = 1,
var2 = 1,
var3 = 1;
这等价于:
var var1 = var2 = var3 = 1;
我很确定这是变量定义的顺序:var3, var2, var1,这相当于:
var var3 = 1, var2 = var3, var1 = var2;
有什么方法可以在JavaScript中确认这一点吗?可能使用一些分析器?
当前回答
证明
let var1 = {set a(a){console.log(1)}}, var2 = {set a(a){console.log(2)}}, var3 = {set a(a){console.log(3)}}; var1.a = var2.a = var3.a = 1
其他回答
javascript中的赋值是从右向左的。Var var1 = var2 = var3 = 1;
如果在这条语句之后,这些变量中的任何一个值都是1,那么逻辑上它必须从右边开始,否则var1和var2的值将是未定义的。
你可以认为它相当于var var1 = (var2 = (var3 = 1));首先计算最里面的圆括号。
Coffee-script可以做到这一点。
for x in [ 'a', 'b', 'c' ] then "#{x}" : true
[{a: true}, {b: true}, {c: true}]
证明
let var1 = {set a(a){console.log(1)}}, var2 = {set a(a){console.log(2)}}, var3 = {set a(a){console.log(3)}}; var1.a = var2.a = var3.a = 1
var var var1 = 1, var2 = 1, var3 = 1;
在本例中,var关键字适用于所有三个变量。
var var1 = 1,
var2 = 1,
var3 = 1;
这并不等同于:
var var1 = var2 = var3 = 1;
在这种情况下,在屏幕后面,var关键字仅适用于var1,因为变量提升,表达式的其余部分正常计算,因此变量var2, var3将成为全局变量
Javascript对这段代码的处理顺序如下:
/*
var1 is local to the particular scope because of var keyword
var2 and var3 will become globals because they are used without var keyword
*/
var var1; //only variable declarations will be hoisted.
var1 = var2 = var3 = 1;
试试这个:
var var1=42;
var var2;
alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.
注意第一个警告中的单个'='。这将显示赋值表达式的结果是赋值,而第二个警报将显示确实发生了赋值。
从逻辑上讲,赋值必须从右到左链接。然而,由于这对javascript来说都是原子的(没有线程),特定的引擎可能会选择稍微不同的优化方式。