Spider's如果左表达式为null或未定义,则null-coalescing运算符??
将返回正确的表达式。
var name = options.name ?? "default name";
它是如何运作的?
答案 0 :(得分:5)
null-coalescing运算符通常使用简单的条件表达式。例如,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;
声明问题
如果将null-coalescing运算符用作语句而不是表达式,例如:
a() ?? b();
然后Spider编译器使用if语句而不是条件表达式:
if (a() == null) {
b();
}