各プログラミング言語は異なり、Javascript での私の経験は基本的なレベルであるため、1 行の複数の変数の割り当てがどのように評価されるかを知りたい
例:
a = b = c = d = 5;
そのようなステートメントは5
、4 つの変数a
、b
、c
およびのそれぞれに割り当てられd
ますか?
ありがとう。
各プログラミング言語は異なり、Javascript での私の経験は基本的なレベルであるため、1 行の複数の変数の割り当てがどのように評価されるかを知りたい
例:
a = b = c = d = 5;
そのようなステートメントは5
、4 つの変数a
、b
、c
およびのそれぞれに割り当てられd
ますか?
ありがとう。
簡単な答えはイエスです。そのステートメントは、、および5
の 4 つの変数のそれぞれに割り当てられます。しかし、言われたことに反して、 to に代入してから to の値を代入するのではなく、右側から順に各変数に同じ値を代入します。より明確にするために、あなたの声明:a
b
c
d
5
d
d
c
var a, b, c, d;
a = b = c = d = 5;
それは以下と同等です:
var d = 5;
var c = 5;
var b = 5;
var a = 5;
しない:
var d = 5;
var c = d;
var b = c;
var a = b;
これは微妙ですが重要な違いです。最初のケースでは、JavaScriptはすべての変数に値を設定するだけです。2 番目のケースでは、JavaScriptはすべての変数に値を設定しますが、3 つの変数の値も取得します (の値はa
どこにも割り当てられません)。
それを示す簡単なコード:
// `this` is the global object if you run this code in the global scope.
// In the browsers the global object is `window`.
Object.defineProperties(this, {
"a": {
get: function() {
console.log("get a");
},
set: function(value) {
console.log("set a");
}
},
"b": {
get: function() {
console.log("get b");
},
set: function(value) {
console.log("set b");
}
},
"c": {
get: function() {
console.log("get c");
},
set: function(value) {
console.log("set c");
}
},
"d": {
get: function() {
console.log("get d");
},
set: function(value) {
console.log("set d");
}
}
});
b = c = d = 5;
a = b;
コンソールには次のものが必要です。
set d
set c
set b
get b
set a
ステートメントでわかるように、JSb = c = d = 5
は変数のみを設定し、ステートメント.set
get
b
a = b
この区別は非常に重要です。プロパティに getter を定義し、この動作を認識していない場合、複数の変数割り当てを使用して予期しないバグが発生する可能性があるためです。
ほとんどの場合はそうですが、次のシナリオを検討してください。
Object.defineProperty(this, "b", { value : 6, writable : false });
var a, c, d;
a = b = c = d = 5;
console.log(a); // 5
console.log(b); // 6
console.log(c); // 5
console.log(d); // 5
答えはイエスです。
a=b=c=d=e=f=g=h=4; // all get to be 4
a=b=c=d=e=f=g=h={ p1:"1", p2:"2" }; // same object for all
a.p3 = "3";
console.log((a==b && b==c && c==d && d==e), f); // condition is true, f is now
// {
// p1:"1",
// p2:"2",
// p3:"3"
// }
答えを知るには、試してみるだけです:はい.
そのように機能する理由は、代入が等号の右側にあるものをすべて取り、その値を左側の変数に代入するためです。
に割り当て5
られd
ます。の値d
が割り当てられc
ます。