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中确认这一点?可能使用一些性能分析工具吗?
实际上,
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
。 - gcbvar v1,v2,v3;
然后稍后:v1 = v2 = v3 = 6;
它们仍将在本地范围内。由于David提到了警报,这将按预期工作(如果已经声明变量):alert(v1 = v2 = v3 = 6);
- ShawnFumo在JavaScript中,赋值操作符是从右往左执行的。var var1 = var2 = var3 = 1;
如果这个语句执行后任何一个变量的值为1
,那么逻辑上它肯定是从右侧开始赋值的。否则var1
和var2
的值将为未定义。
你可以将其视为等同于var var1 = (var2 = (var3 = 1));
其中最内层括号首先被计算。
var
后面不能立即跟着(
。删除最外层的括号使其能够编译而不出错,即var var1 = (var2 = (var3 = 1));
。当时我感觉这并没有很好地阐明问题,但我想它是一样的。 - Justin Johnsonvar var1 = var2 = var3 = 1;.
equal tovar var3 = 1; var var2 = var3; var var1 = var2;
- xgqfrmsvar var1 = 1, var2 = 1, var3 = 1;
在这种情况下,var
关键字适用于这三个变量。
var var1 = 1,
var2 = 1,
var3 = 1;
这不等同于以下代码:
var var1 = var2 = var3 = 1;
在这种情况下,由于变量提升(hoisting),屏幕后台只有 var1
变量适用于 var
关键字,表达式的其余部分会正常评估,因此变量 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;
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
请注意,逗号运算符实际上是最低权限的运算符,但括号是最高权限的运算符,在构建单行表达式时它们必须配合使用。
最终,您可能需要 'thunks' 而不是硬编码的值,对我来说,一个 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.
最初的回答
var var1, var2, var3
var1 = var2 = var3 = 1
那么,let赋值呢?与var完全相同,不要因为块作用域而让let赋值使你困惑。
最初的回答:
Let和var在赋值方面是一样的,不要被let的块级作用域所迷惑。
let var1 = var2 = 1 // here var2 belong to the global scope
最初的回答:
let v1, v2, v3
v1 = v2 = v3 = 2
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
coffee-script
可以轻松实现此功能。
for x in [ 'a', 'b', 'c' ] then "#{x}" : true
this.var1 = this.var2 = this.var3 = 1
,这个规则是否也适用? - Buddybear