使用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
,那么逻辑上它必须从右边开始,否则值或者var1
和var2
将是未定义的。
虽然它不会编译,但可以认为它等价于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 } ]