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));
JavaScript での割り当ては、右から左に機能します。var var1 = var2 = var3 = 1;
.
これらの変数のいずれかの値が1
このステートメントの後にある場合、論理的には右から開始する必要があります。そうでない場合、値 or var1
andvar2
は未定義になります。
var var1 = (var2 = (var3 = 1));
最も内側の括弧のセットが最初に評価される場所と同等と考えることができます。
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;
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
コンマ演算子は実際には最も権限の低い演算子ですが、括弧は最も権限の高い演算子であり、1 行の式を作成する際に連携して使用されることに注意してください。
最終的には、ハードコードされた値ではなく「サンク」が必要になる場合があります。私にとって、サンクは関数と結果の値の両方です (同じ「もの」)。
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.
最初のアラートの単一の「=」に注意してください。これは、代入式の結果が代入された値であることを示し、2 番目のアラートは代入が行われたことを示します。
論理的には、代入は右から左に連鎖している必要があります。ただし、これはすべて javascript に対してアトミックであるため (スレッド化はありません)、特定のエンジンは実際には少し異なる方法で最適化することを選択する場合があります。
それらが同じではないことは、今では明らかです。そのコーディング方法は
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
注:ところで、複数の割り当てを使用することはお勧めしません。同じ行で複数の宣言を使用することもお勧めしません。