使用JavaScript进行多个左侧分配

var var1 = 1, var2 = 1, var3 = 1; 

这相当于这个:

 var var1 = var2 = var3 = 1; 

我相当肯定这是variables定义的顺序:var3,var2,var1,这将等同于:

 var var3 = 1, var2 = var3, var1 = var2; 

有没有什么办法在JavaScript中确认这一点? 可能使用一些分析器?

其实,

 var var1 = 1, var2 = 1, var3 = 1; 

等同于:

 var var1 = var2 = var3 = 1; 

区别在于范围:

 function good() { var var1 = 1, var2 = 1, var3 = 1; } function bad() { var var1 = var2 = var3 = 1; } good(); console.log(window.var2); // undefined bad(); console.log(window.var2); // 1. Aggh! 

JavaScript中的作业从右到左起作用。 var var1 = var2 = var3 = 1;

如果在这个语句之后这些variables中的任何一个的值是1 ,那么逻辑上它必须从右边开始,否则值或者var1var2将是未定义的。

虽然它不会编译,但可以认为它等价于var (var1 = (var2 = (var3 = 1))); 最先评估最内侧的一组圆括号。

var var1 = 1,var2 = 1,var3 = 1;

在这种情况下, var关键字适用于所有这三个variables。

 var var1 = 1, var2 = 1, var3 = 1; 

这不等于这个:

var var1 = var2 = var3 = 1;

在这种情况下,屏幕后面的var关键字只适用于var1由于variables提升和expression式的其余部分正常计算,所以variablesvar2, var3变成全局variables

Javascript按以下顺序处理这段代码:

 /* var 1 is local to the particular scope because of var keyword var2 and var3 will become globals because they've 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. 

注意第一个警报中的单个“=”。 这将显示分配expression式的结果是分配的值,第二个警报将显示分配确实发生。

从逻辑上讲,分配必须从右向左链接。 然而,因为这是所有primefaces的JavaScript(没有线程)一个特​​定的引擎可能会select实际优化有点不同。

 a = (b = 'string is truthy'); // b gets string; a gets b, which is a primitive (copy) a = (b = { c: 'yes' }); // they point to the same object; a === b (not a copy) 

(a && b)(a ? b : a)

(a || b)(a ? a : b)

(a = 0, b)是不在乎a是否真的,隐含地返回b


 a = (b = 0) && "nope, but a is 0 and b is 0"; // b is falsey + order of operations a = (b = "b is this string") && "a gets this string"; // b is truthy + order of ops 

JavaScript运算符优先级(操作顺序)

请注意,逗号运算符实际上是最小权限的运算符,但是括号是最有特权的,并且在构build单行expression式时它们携手并进。


最终,你可能需要“thunk”而不是硬编码的原始值,而且我意外地传递了多个参数,而不是通过两个expression式来绊倒。

对我来说,thunk既是函数也是结果值(同样的东西)。

 const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk windowInnerHeight(); // a thunk 

coffee-script可以做到这一点aplomb ..

 for x in [ 'a', 'b', 'c' ] then "#{x}" : true 

[ { a: true }, { b: true }, { c: true } ]