JavaScript中的`x = y,z`逗号分配

Yat*_*wal 21 javascript variable-assignment assignment-operator assign iterable-unpacking

可能重复:
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;
}
Run Code Online (Sandbox Code Playgroud)

什么是x = (y = x, z)结构是什么意思?或者更具体地说,是什么y = x, z意思?我称之为逗号分配,因为它看起来像赋值并且有逗号.

在Python中,它意味着元组解包(或在这种情况下打包).这是同样的情况吗?

mbi*_*tte 19

这是逗号运算符.

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

评估a,b,c,...,n时的结果值将始终是最右侧表达式的值,但仍会评估链中的所有表达式(从左到右).


因此,在您的情况下,仍将评估分配,但最终值将是bassoon.

结果:

galleons = brigantines
brigantines = bassoon
armada.embrace(basson)
Run Code Online (Sandbox Code Playgroud)

更多信息:Javascript"元组"符号:它有什么意义?


I H*_*azy 9

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

var a, b, c;
Run Code Online (Sandbox Code Playgroud)

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


,可被用作逗号操作符.它只是评估一系列表达式.因此,当您看到以下语法时,您将看到正在计算的一系列表达式,以及返回的最后一个表达式的返回值.

x = (y = x, z)
Run Code Online (Sandbox Code Playgroud)

在parens中,x被分配y,然后z被评估并从()分配返回x.


我建议这种语法不清楚,并没什么好处.

  • 编程语言只能和使用它的程序员一样好!;-)你可以用JVM(在Java中)做一些非常讨厌的事情,以便与其他程序员混淆(在执行期间更改类定义?检查.).对于C/C++中的指针也一样(我说的是滥用`*(*(*(*(*(*p)))))`,而不是合法的指针使用).在PHP?甚至不让我开始..!但我肯定会禁止使用这种逗号来做好习惯.我必须承认我甚至不能想到它的合法使用(当然,除了声明变量和枚举之外). (5认同)
  • 充其量是中性的,平均而言是积极有害的。典型的JavaScript:/ (2认同)

0x4*_*2D2 9

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

x = (y = x, z);
Run Code Online (Sandbox Code Playgroud)

要么

y = x;

x = z;
Run Code Online (Sandbox Code Playgroud)

它可以带走那行代码.

  • 什么是friggin'点? (5认同)
  • Yatharth:丑陋的代码真的没有意义.坦率地说,我不知道为什么有人会使用它,除了搞砸未来的程序员(或许这就是重点,确保他仍然是项目中唯一的程序员?).这就像PHP中的那些人一样:`$ hi ='oo!'; $ myVar ='hi'; $ a ='myVar'; echo $$$ a; //打印'oo!'.` - 有些男人只想看世界燃烧.我会像在答案中所做的那样写(**结果**部分). (5认同)