4

由于每种编程语言都不同,而且我对 Javascript 的经验处于基础水平,我想知道如何评估一行中的多个变量分配

例子:

 a = b = c = d = 5;

这样的语句是否会分配给 4个5变量a,b和?cd

谢谢。

4

4 回答 4

16

简短的回答是肯定的,该语句将分配5给 4 个变量abc中的每一个d。但是,与前面所说的相反,它不会分配5d,然后是dto的值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 只是为所有变量设置一个值。在第二种情况下,JavaScript为所有变量设置了一个值,获取了三个变量的值(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

如您所见,对于语句b = c = d = 5JS 仅设置变量,并同时调用setgeton b,因为语句a = 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 回答