2012-03-26 36 views
36

在C#中,你可以做到以下幾點:Javascript中的空合併?

string y = null; 
string x = y ?? "sup stallion"; //x = "sup stallion" since y is null. 

哪裏的??運算符是空合併運算符。

而且在Javascript中我見過類似的東西:

var headers; 
var myHeader = headers || {'Content-type':'text/plain'}; //myHeaders = {'Content... 

I've also seen: (The 2nd code snippet on the page)

var headers; 
var myHeader = headers | {'Content-type':'text/plain'}; 

有沒有兩者之間的區別嗎?這種模式稱爲...默認參數是什麼?

+3

你想'''.. – 2012-03-26 01:23:16

+0

錯字,它應該是'||' – qwertymk 2012-03-26 01:32:28

+1

可能的重複[JavaScript中是否存在「null coalescing」運算符?](http://stackoverflow.com/questions/476436/is-there-a-null-coalescing-operator-in-javascript) – 2015-02-04 22:54:34

回答

34

||logical or。它返回第一個真值操作數*(最後一個值)。所以

var myHeader = headers || {'Content-type':'text/plain'}; 

返回「標題」,如果它真的(如果它是空的或未定義的,該值被編入「false」)。如果它是錯誤的,它將返回第二個操作數。我不相信這在JavaScript中有一個非常具體的名稱,只是像「默認參數值」一般。

|bitwise or。這是一個數學運算,完成了一些完全不同的事情。該操作員在這裏甚至沒有意義(因此通常只會生成0)。無論你看到那個地方,它肯定是一個錯字,他們的意思是使用邏輯或。

所以去那個第一個方法(a = b || c)。

*「邏輯或」也被稱爲「邏輯析取」或「包含析取」。與所有編程語言一樣,Javascript使用short-circuit evaluation來評估邏輯語句。使用邏輯或表達式,它會評估每個操作數的真實性並在第一個真正的操作數上停止(並返回該值)。如果沒有真正的操作數,它仍然需要經歷所有的操作數,所以它返回最後一個操作數,它仍然是最後一個操作數。邏輯和(& &)類似地通過停止第一個僞操作數而短路。

+0

我在原始問題中添加了一個鏈接。但這裏是:http://csausdev.wordpress.com/2010/12/17/dependency-injection-in-node-js/ – Alan 2012-03-26 01:22:27

+0

我知道,一般來說''==='防止類型強制,但在這種情況下,這是可以接受的JavaScript,還是我學習壞習慣? – Alan 2012-03-26 01:24:09

+0

@Alan,你說得對,那種類型的強制通常是可以避免的,但這是少數情況下它通常*好的一種情況。例外情況是當「默認」值可能有點虛假時(例如,文字「false」vs「undefined」)。在這種情況下,您需要使用三元條件運算符。 – 2012-03-26 01:28:17

3

我不熟悉第二種模式。我知道的兩種模式:

1)你的第一個模式是一個基本的邏輯或操作符。如果第一個值是虛假的,則分配第二個值。

2)第二種模式稱爲三元賦值,它在邏輯上與基本的if條件類似,但語法略有不同。

var test = (typeof myTest === "string") ? firstValue : secondValue; 

在此模式中,問號將條件與值分開,冒號分隔值。三級分配可以嵌套,以便其中一個值包含另一個三級分配。

+1

三元**不是三級 – Joe 2014-05-28 16:51:42

+0

@Joe感謝拼寫課 – 2017-01-19 17:29:36

+1

@ johnny5它不是拼寫錯誤,它是錯誤的詞。 – Murph 2017-02-13 12:02:03