JavaScript中的`x = y, z`逗号赋值是什么意思?

25

可能是重复问题:
JavaScript语法:逗号的含义是什么?

我在阅读这篇文章时遇到了这段代码(使用Ctrl+F搜索Andre Breton):

//function returning array of `umbrella` fibonacci numbers
function Colette(umbrella) {
  var staircase = 0, galleons = 0, brigantines = 1, armada = [galleons, brigantines], bassoon;
  Array.prototype.embrace = [].push;

  while(2 + staircase++ < umbrella) {
    bassoon = galleons + brigantines;
    armada.embrace(brigantines = (galleons = brigantines, bassoon));
  }

  return armada;
}

x = (y = x, z) 这个结构的意思是什么?更具体地说,y = x, z 意味着什么?我称之为逗号赋值,因为它看起来像是赋值并且有一个逗号。

在 Python 中,这表示元组拆包(或打包,在这种情况下)。这里也是同样的情况吗?

3个回答

24

这是逗号运算符。

逗号运算符会从左到右依次计算它的两个操作数并返回第二个操作数的值。

当表达式 a,b,c,...,n 被计算时,其结果总是最右边表达式的值,但所有在链中的表达式仍然会被计算(从左到右)。


因此,在您的情况下,赋值语句仍将被计算,但最终的值将是bassoon

结果:

galleons = brigantines
brigantines = bassoon
armada.embrace(basson)
更多信息:Javascript "tuple" notation: what is its point?

1
除非bassoon的值为“undefined”,否则galleons = brigantines。 - Jorge Orpinel Pérez

10
< p >var 语法允许多重赋值,因此当您看到以下内容时,您正在使用一个 var 声明多个变量。

var a, b, c;

请注意,这个语法不是逗号操作符


, 可以用作逗号操作符。它只是简单地评估一系列表达式。所以当你看到下面的语法时,你看到的是一系列表达式被评估,并且最后一个表达式的返回值被返回。

x = (y = x, z)

在括号内,x被赋值给y,然后z()中评估并返回,最后赋值给x


我建议这种语法不够清晰,且提供的帮助很少。


2
充其量是中立的,平均而言则是有害的。典型的JavaScript :/ - Yatharth Agarwal
6
一门编程语言的好坏,取决于使用它的程序员的水平!;-) 在Java中,通过JVM可以做一些非常恶劣的事情来干扰其他程序员(在执行期间改变类定义?没问题)。在C/C++中指针也是如此(我指的是虐待性地使用*(*(*(*(*(*p))))),而不是合理的指针使用)。在PHP中?别提了..! 但我肯定会禁止这种逗号用法成为良好实践的一部分。我必须承认,除了声明变量和枚举以外,我甚至想不到它的合理用途。 - mbinette

9
逗号运算符会评估其所有操作数并返回最后一个操作数。在这种情况下,如果我们使用了逗号运算符,结果不会有任何区别。
x = (y = x, z);

或者

y = x;

x = z;

这是为了减少那一行代码而存在的。


@YatharthROCK,将代码放在一行上没有任何意义。就这么简单。 - David G
为什么你想这样做呢?实际上它使用的字符更多(9个而不是8个)。那么可能有什么正当理由呢? - Yatharth Agarwal
@YatharthROCK 最好使用单个语句而不是逗号运算符,但有时这只是作者的偏好。如果变量名很短,且 x = (y = x, z); 的目标易于理解,则我认为以这种方式编写是可以的。 - David G
不是这样的。我不觉得没有充分的理由来证明这个代码不可以写成 y = x; x = z 的形式,你已经知道它所带来的副作用了。 - Yatharth Agarwal
5
Yatharth:那些丑陋的代码真的没有任何意义。坦白地说,我不知道为什么除了在以后让程序员乱搞(或者也许这就是全部目的,确保他是项目中唯一的程序员?)之外还有谁会使用它。这就像那些在PHP中编写的人一样:$hi = 'oo!'; $myVar = 'hi'; $a = 'myVar'; echo $$$a; // 输出 'oo!' - 有些人只想看到世界燃烧。我会按照我的答案所示来编写它(结果部分)。 - mbinette
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接