Javascript 零合并操作符(?)如何在Spider中工作?

Javascript 零合并操作符(?)如何在Spider中工作?,javascript,null-coalescing-operator,spiderlang,Javascript,Null Coalescing Operator,Spiderlang,如果左侧表达式为null或未定义,则null合并运算符??返回右侧表达式 var name = options.name ?? "default name"; 它是如何工作的?空合并运算符通常与简单的条件表达式一起工作。例如,Spider中的以下代码: var name = options.name ?? "default name"; var name = name ?? "value"; var name = getName() ?? "default name"; 编译为以下Jav

如果左侧表达式为null或未定义,则null合并运算符
??
返回右侧表达式

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

它是如何工作的?

空合并运算符通常与简单的条件表达式一起工作。例如,Spider中的以下代码:

var name = options.name ?? "default name";
var name = name ?? "value";
var name = getName() ?? "default name";
编译为以下JavaScript:

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

未定义标识符问题

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

var name = options.name ?? "default name";
var name = name ?? "value";
var name = getName() ?? "default name";
在JS中编译为以下代码:

var name = typeof name === "undefined" || name == null ? "value" : name;
请注意,如果您想执行类似
options.name??“default”
如果您不确定是否定义了
选项,则可以使用null传播运算符:

var name = options?.name ?? "default";
双功能调用问题

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

var name = options.name ?? "default name";
var name = name ?? "value";
var name = getName() ?? "default name";
被编译成如下内容:

var tmp = getName();
var name = tmp == null ? "default name" : tmp;
语句问题

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

a() ?? b();
然后,Spider编译器使用if语句而不是条件表达式:

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