JavaScript中的`x = y,z`逗号赋值[重复]

Posted

技术标签:

【中文标题】JavaScript中的`x = y,z`逗号赋值[重复]【英文标题】:`x = y, z` comma assignment in JavaScript [duplicate] 【发布时间】:2012-09-28 00:10:10 【问题描述】:

可能重复:javascript syntax: what comma means?

我在阅读 this article 时遇到了代码(执行 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 是什么意思?我称它为逗号赋值,因为它看起来像赋值并且有一个逗号。

In Python,这意味着元组拆包(或在这种情况下打包)。这里是不是也一样?

【问题讨论】:

【参考方案1】:

这是逗号操作符。

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

计算 a,b,c,...,n 时的结果值将始终是 最右边表达式的值,但是 链仍在评估中(从左到右)。


因此,在您的情况下,仍会评估分配,但最终值为 bassoon

结果:

galleons = brigantines
brigantines = bassoon
armada.embrace(basson)

更多信息:Javascript "tuple" notation: what is its point?

【讨论】:

除非巴松管的值为undefined,那么galeons = brigantines【参考方案2】:

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

var a, b, c;

请注意,此语法不是 逗号运算符


, 可以用作comma operator。它只是评估一系列表达式。因此,当您看到以下语法时,您会看到一系列正在计算的表达式,并返回最后一个表达式的返回值。

x = (y = x, z)

在括号内,x 被分配给y,然后z 被评估并从() 返回并分配给x


我建议这种语法不清楚并且没有什么好处。

【讨论】:

充其量是中性的,平均而言是有害的。典型的 JavaScript :/ 一种编程语言只能和使用它的程序员一样好! ;-) 您可以使用 JVM(在 Java 中)做一些非常讨厌的事情来惹恼其他程序员(在执行期间更改类定义?检查。)。 C/C++ 中的指针也是如此(我说的是滥用*(*(*(*(*(*p))))),而不是合法的指针使用)。在 php 中?甚至不要让我开始..!但我肯定会禁止在良好实践中使用这种逗号。我必须承认我什至想不出它的合法用途(当然,除了声明变量和枚举......)。【参考方案3】:

逗号操作数计算其所有操作数并返回最后一个。如果我们使用过,在这种情况下没有区别

x = (y = x, z);

y = x;

x = z;

它可以去掉那行代码。

【讨论】:

@YatharthROCK 将代码放在一行没有意义。就这么简单。 您为什么要这样做?它实际上使用了更多的字符(9 个而不是 8 个)。那么有什么可能的理由呢? @YatharthROCK 使用单个语句而不是逗号运算符更好,但有时这只是作者的偏好。如果变量名很短并且x = (y = x, z); 的目标很容易理解,那么我认为这样写是可以的。 不,不是。我看不出不能写成 y = x; x = z 的充分理由,而且你已经知道了不好的影响。 Yatharth:那个丑陋的代码真的没有意义。坦率地说,我不知道为什么有人会使用它,除了惹恼未来的程序员(或者也许这就是重点,确保他仍然是项目中唯一的程序员?)。就像 PHP 中的那些人一样:$hi = 'oo!'; $myVar = 'hi'; $a = 'myVar'; echo $$$a; //prints 'oo!'. - 有些人只是想看着世界燃烧。我会像在我的回答中那样写(result 部分)。

以上是关于JavaScript中的`x = y,z`逗号赋值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript运算符

JavaScript 运算符

JavaScript 运算符

python如何为配置文件中的单个键分配2个逗号分隔值

JavaScript 运算符

变量的三个特征和花式赋值