2014-11-22 54 views

回答

5

空合并运算符通常使用简单的条件表达式。例如,该代码在蜘蛛:

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

编译成以下JavaScript:

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

(more about equals equals null)

未定义的标识符问题

注意,如果左侧表达式是一个标识符,并且该标识符是未定义的,那么JS解释器会引发错误。为了解决这个问题,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编译器将调用表达式移到一个不同的变量中。比如这段代码中蜘蛛:

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

被编译成这样的:

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

声明问题

如果空合并运算符用作陈述,而不是作为一个表达,例如:

a() ?? b(); 

Spider编译器使用if语句代替条件表达式:

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