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`逗号赋值[重复]的主要内容,如果未能解决你的问题,请参考以下文章