使用JavaScript进行多次左手分配

Dav*_*oun 181 javascript variables variable-assignment

var var1 = 1,
    var2 = 1,
    var3 = 1;
Run Code Online (Sandbox Code Playgroud)

这相当于:

var var1 = var2 = var3 = 1;
Run Code Online (Sandbox Code Playgroud)

我很确定这是变量定义的顺序:var3,var2,var1,它等价于:

var var3 = 1, var2 = var3, var1 = var2;
Run Code Online (Sandbox Code Playgroud)

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

Cre*_*esh 390

其实,

var var1 = 1, var2 = 1, var3 = 1;
Run Code Online (Sandbox Code Playgroud)

不是等同于:

var var1 = var2 = var3 = 1;
Run Code Online (Sandbox Code Playgroud)

区别在于范围界定:

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!
Run Code Online (Sandbox Code Playgroud)

实际上这表明赋值是正确的关联.该bad示例相当于:

var var1 = (window.var2 = (window.var3 = 1));
Run Code Online (Sandbox Code Playgroud)

  • 当,这是出乎意料的.谢谢你的提示,我会留意这一点. (41认同)
  • 需要注意的是:如果你知道你想提前做这件事,你仍然可以从作业中分解出来.所以:`var v1,v2,v3;`然后是:`v1 = v2 = v3 = 6;`它们仍然在本地范围内.由于David提到警报,这将按预期工作(如果预先变量):`alert(v1 = v2 = v3 = 6); (11认同)
  • @ SkinnyG33k,因为它是从右到左.所以它会在最左边之前解析最右边的.所以`var var1 = var2`发生在`var3 = 1`之后和'var2 = var3`之后.就像`var3 = 1; VAR2 = VAR3; var var1 = var2` (10认同)
  • 我不明白...为什么 bad() 中的变量会超出函数范围?当函数完成时,它们不应该被垃圾收集吗? (4认同)
  • 究竟.但是,如果我们遵循一些常见的最佳实践,在这种情况下,通过在顶部声明我们的变量,我们可以避免不必要的错误,并避免局部变量泄漏到全局范围.请参阅:http://jsfiddle.net/gleezer/r9Mu8/1/ (3认同)

Jus*_*son 18

javascript中的赋值从右到左工作.var var1 = var2 = var3 = 1;.

如果这些变量的值是1该语句之后,那么在逻辑上它必须从右边开始,否则价值或var1var2将是不确定的.

您可以将其视为等同于var var1 = (var2 = (var3 = 1));首先评估最内部括号集的位置.

  • 这实际上是一个语法错误.你不能有`(``````````````````````````````````````````````````````````````````````````````````````````````````'也很好地说明了这一点,但我认为它是一样的. (5认同)

nea*_*sic 8

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)
Run Code Online (Sandbox Code Playgroud)

(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
Run Code Online (Sandbox Code Playgroud)

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

请注意,逗号运算符实际上是权限最小的运算符,但括号是最有特权的,并且在构造单行表达式时它们是相辅相成的.


最终,你可能需要'thunks'而不是硬编码的值,对我来说,thunk既是函数又是结果值(相同的'东西').

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

windowInnerHeight(); // a thunk
Run Code Online (Sandbox Code Playgroud)


Gan*_*nnu 7

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

在这种情况下, var关键字适用于所有三个变量.

var var1 = 1,
    var2 = 1,
    var3 = 1;
Run Code Online (Sandbox Code Playgroud)

这不等于这个:

var var1 = var2 = var3 = 1;

在这种情况下,屏幕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; 
Run Code Online (Sandbox Code Playgroud)