var var1 = 1,
var2 = 1,
var3 = 1;
这等效于:
var var1 = var2 = var3 = 1;
我相当确定这是定义变量的顺序:var3,var2,var1,这等效于此:
var var3 = 1, var2 = var3, var1 = var2;
有什么方法可以用JavaScript确认吗?可能使用一些分析器?
this.var1 = this.var2 = this.var3 = 1
吗?
var var1 = 1,
var2 = 1,
var3 = 1;
这等效于:
var var1 = var2 = var3 = 1;
我相当确定这是定义变量的顺序:var3,var2,var1,这等效于此:
var var3 = 1, var2 = var3, var1 = var2;
有什么方法可以用JavaScript确认吗?可能使用一些分析器?
this.var1 = this.var2 = this.var3 = 1
吗?
Answers:
其实,
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!
实际上,这表明分配是正确的关联。该bad
示例等效于:
var var1 = (window.var2 = (window.var3 = 1));
var var1=var2
发生在var3 = 1
前后var2 = var3
。就像var3=1; var2=var3; var var1=var2
var v1, v2, v3;
然后,以后:v1 = v2 = v3 = 6;
它们仍将在本地范围内。由于David提到了警报,因此可以按预期工作(如果进行了预可变):alert(v1 = v2 = v3 = 6);
JavaScript中的分配从右到左起作用。var var1 = var2 = var3 = 1;
。
如果这些变量中的任何一个的值1
在此语句之后,则从逻辑上讲它必须是从右开始的,否则值or var1
和var2
将是未定义的。
您可以认为它等同于 var var1 = (var2 = (var3 = 1));
首先评估最里面的括号的位置。
(
之后立即拥有var
。删除括号的外部集可以使其编译无误var var1 = (var2 = (var3 = 1));
。当时我觉得它并没有很好地说明这一点,但我想它也是一样。
var var1 = var2 = var3 = 1;.
等于 var var3 = 1; var var2 = var3; var var1 = var2;
var var1 = 1,var2 = 1,var3 = 1;
在这种情况下, var
关键字适用于所有三个变量。
var var1 = 1,
var2 = 1,
var3 = 1;
这不等于:
var var1 = var2 = var3 = 1;
在这种情况下,screens var
关键字后面的关键字仅适用于var1
变量提升,并且表达式的其余部分正常计算,因此变量var2, var3
变为全局变量
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;
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 || b)
从逻辑上讲(a ? a : b)
,其行为类似于加法(例如!!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
请注意,逗号运算符实际上是特权最低的运算符,而括号是特权最高的运算符,并且在构造单行表达式时它们会齐头并进。
最终,您可能需要“ thunk”而不是硬编码的值,对我而言,thunk是函数和结果值(相同的“事物”)。
const windowInnerHeight = () => 0.8 * window.innerHeight; // a thunk
windowInnerHeight(); // a thunk
试试这个:
var var1=42;
var var2;
alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.
注意第一个警报中的单个“ =”。这将显示分配表达式的结果是分配的值,第二警报将向您显示分配确实发生。
从逻辑上讲,分配必须从右到左链接在一起。但是,由于这对javascript来说是原子的(没有线程),因此特定引擎可能会选择实际进行一些优化。
coffee-script
可以坚定地做到这一点。
for x in [ 'a', 'b', 'c' ] then "#{x}" : true
[ { a: true }, { b: true }, { c: true } ]