2014-11-22 24 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(); 
} 
相關問題