Alo*_*kin 3 javascript null-coalescing-operator spiderlang
??如果左表达式为null或未定义,Spider的 null-coalescing运算符将返回正确的表达式.
var name = options.name ?? "default name";
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?
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)
未定义的标识符问题
请注意,如果左表达式是标识符,并且该标识符未定义,则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)