【问题标题】:`x = y, z` comma assignment in JavaScript [duplicate]JavaScript中的`x = y,z`逗号赋值[重复]
【发布时间】: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,这意味着元组拆包(或在这种情况下打包)。这里是不是也一样?

【问题讨论】:

    标签: javascript variable-assignment assignment-operator assign iterable-unpacking


    【解决方案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 部分)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    • 2014-03-01
    • 2022-12-12
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多