4

各プログラミング言語は異なり、Javascript での私の経験は基本的なレベルであるため、1 行の複数の変数の割り当てがどのように評価されるかを知りたい

例:

 a = b = c = d = 5;

そのようなステートメントは5、4 つの変数abcおよびのそれぞれに割り当てられdますか?

ありがとう。

4

4 に答える 4

16

簡単な答えはイエスです。そのステートメントは、、および5の 4 つの変数のそれぞれに割り当てられます。しかし、言われたことに反して、 to に代入してから to の値を代入するのではなく、右側から順に各変数に同じ値を代入します。より明確にするために、あなたの声明:abcd5ddc

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は変数のみを設定し、ステートメント.setgetba = b

この区別は非常に重要です。プロパティに getter を定義し、この動作を認識していない場合、複数の変数割り当てを使用して予期しないバグが発生する可能性があるためです。

于 2012-07-17T01:35:01.807 に答える
5

ほとんどの場合はそうですが、次のシナリオを検討してください。

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
于 2012-07-17T00:25:41.247 に答える
2

答えはイエスです。

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"
//    }
于 2012-07-17T00:18:24.840 に答える
0

答えを知るには、試してみるだけです:はい.

そのように機能する理由は、代入が等号の右側にあるものをすべて取り、その値を左側の変数に代入するためです。

に割り当て5られdます。の値dが割り当てられcます。

于 2012-07-17T00:18:00.850 に答える