使用JavaScript进行多次左手分配

时间:2009-11-18 19:48:38

标签: javascript variables variable-assignment

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

这相当于:

var var1 = var2 = var3 = 1;

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

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

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

7 个答案:

答案 0 :(得分:373)

实际上,

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));

答案 1 :(得分:17)

javascript中的分配从右到左进行。 var var1 = var2 = var3 = 1;

如果这个变量之后的任何变量的值都是1,那么逻辑上它必须从右边开始,否则值var1var2将是未定义的。

你可以认为它等同于var var1 = (var2 = (var3 = 1));,其中首先评估最内部的括号集。

答案 2 :(得分: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)

(a && b)逻辑上为(a ? b : a),其行为类似于乘法(例如。!!a * !!b

(a || b)逻辑上为(a ? a : b),其行为与添加相似(例如!!a + !!b

如果(a = 0, b)是真实的,则{p> 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 Operator Precedence (Order of Operations)

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

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

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

windowInnerHeight(); // a thunk

答案 3 :(得分:7)

  

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

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

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

与此不相同:

  

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; 

答案 4 :(得分:4)

试试这个:

var var1=42;
var var2;

alert(var2 = var1); //show result of assignment expression is assigned value
alert(var2); // show assignment did occur.

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

逻辑上讲,分配必须从右到左链接。但是,由于这对javascript来说都是原子的(没有线程),特定的引擎可能会选择实际优化它。

答案 5 :(得分:0)

现在很明显,它们并不相同。的编码方式

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

那么,让位呢?与var完全相同,不要因为块范围而让let分配使您感到困惑。

let var1 = var2 = 1 // here var2 belong to the global scope

我们可以执行以下操作:

let v1, v2, v3
v1 = v2 = v3 = 2

注意:顺便说一句,我不建议使用多个分配,甚至不要在同一行中使用多个声明。

答案 6 :(得分:-3)

coffee-script可以用aplomb实现这一目标。

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

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