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このステートメントの後にある場合、論理的には右から開始する必要があります。そうでない場合、値 or var1andvar2は未定義になります。

var var1 = (var2 = (var3 = 1));最も内側の括弧のセットが最初に評価される場所と同等と考えることができます。

于 2009-11-18T20:15:19.933 に答える
11

var var1 = 1、var2 = 1、var3 = 1;

この場合 var、キーワードは 3 つの変数すべてに適用できます。

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 演算子の優先順位 (操作の順序)

コンマ演算子は実際には最も権限の低い演算子ですが、括弧は最も権限の高い演算子であり、1 行の式を作成する際に連携して使用されることに注意してください。


最終的には、ハードコードされた値ではなく「サンク」が必要になる場合があります。私にとって、サンクは関数と結果の値の両方です (同じ「もの」)。

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.

最初のアラートの単一の「=」に注意してください。これは、代入式の結果が代入された値であることを示し、2 番目のアラートは代入が行われたことを示します。

論理的には、代入は右から左に連鎖している必要があります。ただし、これはすべて javascript に対してアトミックであるため (スレッド化はありません)、特定のエンジンは実際には少し異なる方法で最適化することを選択する場合があります。

于 2009-11-18T19:50:43.423 に答える
2

それらが同じではないことは、今では明らかです。そのコーディング方法は

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

では、let の代入はどうでしょうか。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 に答える