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

这相当于:

var var1 = var2 = var3 = 1;

我相当确定这是定义变量的顺序:var3、var2、var1,这相当于:

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

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

4

7 回答 7

437

实际上,

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));
于 2009-11-18T20:39:11.057 回答
25

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

如果这些变量中的任何一个的值1在此语句之后,那么从逻辑上讲,它必须从右侧开始,否则值 orvar1var2将是未定义的。

您可以将其视为等效于var var1 = (var2 = (var3 = 1));首先评估最里面的括号集的位置。

于 2009-11-18T20:15:19.933 回答
11

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

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

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

这不等于:

var var1 = var2 = var3 = 1;

在这种情况下,screensvar关键字后面仅适用于var1由于变量提升和表达式的其余部分被正常评估,因此变量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; 
于 2016-03-14T09:35:53.413 回答
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)是不关心是否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 运算符优先级(运算顺序)

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


最终,您可能需要“thunk”而不是硬编码值,对我来说,thunk 既是函数又是结果值(相同的“事物”)。

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

windowInnerHeight(); // a thunk
于 2015-04-30T08:22:31.313 回答
4

试试这个:

var var1=42;
var var2;

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

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

从逻辑上讲,赋值必须从右到左链接。但是,由于这对 javascript 来说都是原子性的(没有线程),因此特定引擎可能会选择以不同方式对其进行实际优化。

于 2009-11-18T19:50:43.423 回答
2

现在很清楚,它们并不相同。编码的方法是

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

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

于 2019-04-01T15:37:31.977 回答
-2

coffee-script可以沉着地做到这一点..

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

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

于 2015-10-15T04:43:29.340 回答