Null-Coalescing运算符(??)如何在Spider中工作?

Alo*_*kin 3 javascript null-coalescing-operator spiderlang

??如果左表达式为null或未定义,Spider的 null-coalescing运算符将返回正确的表达式.

var name = options.name ?? "default name";
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

Alo*_*kin 5

null-coalescing运算符通常使用简单的条件表达式.例如,Spider中的这段代码:

var name = options.name ?? "default name";
Run Code Online (Sandbox Code Playgroud)

编译为以下JavaScript:

var name = options.name == null ? "default name" : options.name;
Run Code Online (Sandbox Code Playgroud)

(更多关于equals等于null)

未定义的标识符问题

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

var name = name ?? "value";
Run Code Online (Sandbox Code Playgroud)

编译为JS中的以下代码:

var name = typeof name === "undefined" || name == null ? "value" : name;
Run Code Online (Sandbox Code Playgroud)

请注意,如果您想要执行类似操作options.name ?? "default"并且您不确定是否options已定义,则可以使用null传播运算符:

var name = options?.name ?? "default";
Run Code Online (Sandbox Code Playgroud)

双重函数调用问题

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

var name = getName() ?? "default name";
Run Code Online (Sandbox Code Playgroud)

编译成如下:

var tmp = getName();
var name = tmp == null ? "default name" : tmp;
Run Code Online (Sandbox Code Playgroud)

声明问题

如果null-coalescing运算符用作语句而不是表达式,例如:

a() ?? b();
Run Code Online (Sandbox Code Playgroud)

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

if (a() == null) {
  b();
}
Run Code Online (Sandbox Code Playgroud)