【问题标题】:How does the Null-Coalescing Operator (??) work in Spider?Null-Coalescing 运算符 (??) 在 Spider 中如何工作?
【发布时间】:2015-01-20 15:38:17
【问题描述】:

Spider's null-coalescing operator ?? 如果左表达式为空或未定义,则返回右表达式。

var name = options.name ?? "default name";

它是如何工作的?

【问题讨论】:

    标签: javascript null-coalescing-operator spiderlang


    【解决方案1】:

    null 合并运算符通常与简单的条件表达式一起使用。例如 Spider 中的这段代码:

    var name = options.name ?? "default name";
    

    编译为以下 JavaScript:

    var name = options.name == null ? "default name" : options.name;
    

    (more about equals equals null)

    未定义标识符问题

    请注意,如果左表达式是一个标识符,并且该标识符未定义,那么 JS 解释器将引发错误。为了解决这个问题,Spider 编译器添加了一个未定义的检查。例如 Spider 中的这段代码:

    var name = name ?? "value";
    

    在JS中编译成如下代码:

    var name = typeof name === "undefined" || name == null ? "value" : name;
    

    请注意,如果您想做类似options.name ?? "default" 的操作,但不确定是否定义了options,您可以使用空传播运算符:

    var name = options?.name ?? "default";
    

    双重函数调用问题

    如果左边的表达式是一个调用表达式(例如fn()),那么它可能会被调用两次——第一次是空测试,第二次是值。为了解决这个问题,Spider 编译器将调用表达式移动到不同的变量。例如 Spider 中的这段代码:

    var name = getName() ?? "default name";
    

    被编译成类似:

    var tmp = getName();
    var name = tmp == null ? "default name" : tmp;
    

    语句问题

    如果将空合并运算符用作语句而不是表达式,例如:

    a() ?? b();
    

    那么 Spider 编译器使用 if 语句而不是条件表达式:

    if (a() == null) {
      b();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 2014-07-04
      • 2011-07-22
      • 2012-01-16
      相关资源
      最近更新 更多