【问题标题】:How does the "||=" operator differ from "?=" in CoffeeScript?"||=" 运算符与 CoffeeScript 中的 "?=" 有何不同?
【发布时间】:2012-05-14 22:42:32
【问题描述】:

这两者有什么区别?从 Ruby 开始,我习惯于 apple ||= walrus 仅当 apple 为 null 时才将 apple 设置为等于 walrus。这在 JS/CS 中似乎是一样的,尽管 ?= 似乎做同样的事情。让我困惑的是:

apple = 0
walrus = 9
apple ?= walrus // outputs 0
apple ||= walrus // outputs 9

哇

【问题讨论】:

    标签: operators coffeescript assignment-operator


    【解决方案1】:

    最好的办法是查看生成的 JS。

    咖啡脚本:

    apple = 0
    walrus = 9
    apple ?= walrus // outputs 0
    apple ||= walrus // outputs 9
    

    JavaScript:

    var apple, walrus;
    apple = 0;
    walrus = 9;
    if (apple == null) apple = walrus;
    apple || (apple = walrus);
    

    如您所见,?= 明确检查的是 JS 中的 null 或 undefined。这与 ||= 非常不同,后者仅依赖于 apple 是否为假值。

    再扩展一点apple ||= walrus与apple = apple || walrus的含义是等价的,所以任何真实的apple值都会短路逻辑而不改变apple的值。

    【讨论】:

    • 最后一行让我明白了。谢谢。
    • (对于普通读者:undefined == null 在 JavaScript 中为 true。undefined 和 null,两个 false-y 值,是 @987654333 的 only 值@ 导致 x == null 为真。)
    • @loganfsmyth 它本来可以做得更糟...它具有一流的函数和闭包(有些语言距离这里很长);-)
    • @pst 哦,当然。我非常喜欢 JS,但它仍然有它的怪癖。
    • 请注意,apple ?= walrus 也可以用作表达式 x = apple ?= walrus(CoffeeScript 中的一切都是表达式),在这种情况下将编译为 x = apple != null ? apple : apple = walrus;。
    【解决方案2】:

    ?= 是 存在 运算符。它会检查 null 和 undefined。

    ||= 只是检查变量的值是否为“非假”,如果我没记错的话……这意味着 0 是假的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-31
      • 2012-04-26
      • 2021-03-09
      • 1970-01-01
      • 2018-06-11
      • 1970-01-01
      • 2013-09-24
      相关资源
      最近更新 更多