2012-03-26 15 views
36

W języku C# można wykonać następujące czynności:Null-koalescing w JavaScript?

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

gdzie operator ?? jest operator null koalescencyjny.

I w JavaScript Widziałem coś podobnego:

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'}; 

Czy jest jakaś różnica między tymi dwoma? Jaki jest ten wzorzec nazywany ... domyślnym parametrem?

+3

Chcesz '||' .. –

+0

literówki, powinno być '||' – qwertymk

+1

możliwy duplikat [Czy istnieje operator "koalescencyjny" w JavaScript?] (http://stackoverflow.com/questions/476436/is-there-a-null-coalescing-operator-in-javascript) –

Odpowiedz

34

|| jest logical or. Zwraca pierwszy prawy operand * (ostatnia wartość oceniona). So "nagłówki"

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

Zwraca jeśli to truthy (a jeśli jest to wartość null lub undefined, że wartość jest coreced na "false"). Jeśli jest to falsey, zwraca drugi operand. Nie wierzę, że ma to bardzo specyficzną nazwę w javascript, po prostu coś ogólnego jak "domyślna wartość argumentu".

| to bitwise or. Jest to operacja matematyczna i robi coś zupełnie innego. Ten operator nie ma nawet sensu (i generalnie generuje tylko wynik). Gdziekolwiek to widziałeś, był to z pewnością literówka i zamierzali użyć logicznego lub.

Więc idź tą pierwszą metodą (a = b || c).

* "Logiczny lub" jest również znany jako "logiczny rozróżnienie" lub "wykluczający tryb łączony". JavaScript, podobnie jak wszystkie języki programowania, ocenia logiczne instrukcje za pomocą short-circuit evaluation. Używając logicznych lub wyrażeń, analizuje każdy operand pod kątem prawdziwości i zatrzymuje się na pierwszym prawdziwym (i zwraca tę wartość). Jeśli nie ma żadnych operandów prawdy, to i tak musiał przejść przez wszystkie z nich, więc zwraca ostatni operand, wciąż ten ostatni, który ocenił. Logiczny i (& &) jest podobnie zwarty przez zatrzymanie pierwszego operandu falsey.

+0

Dodałem link do pierwotnego pytania. Ale tutaj: http://csausdev.wordpress.com/2010/12/17/dependency-injection-in-node-js/ – Alan

+0

Wiem, że ogólnie wolę '===', aby zapobiec typowi przymusu, ale w w tym przypadku, czy jest to akceptowalny javascript, czy też uczę się złego nawyku? – Alan

+0

@Alan, masz rację, że zwykle należy unikać przymusu typu, ale jest to jeden z przypadków mniejszości, w którym zwykle jest * zwykle * w porządku. Wyjątkiem jest sytuacja, w której "domyślna" wartość może oznaczać błąd (np. Literalna "fałsz" kontra "niezdefiniowana"). W takim przypadku będziesz chciał użyć potrójnego operatora warunkowego. –

3

Nie jestem zaznajomiony z drugim wzorem. Dwa znane mi schematy:

1) Twój pierwszy wzór jest podstawowym logicznym lub operatorem. Jeśli pierwsza wartość jest falsy, wówczas przypisywana jest druga wartość.

2) Drugi wzór nazywany jest Ternarnym przypisaniem, które jest podobne w logice do podstawowego warunku if, ale składnia jest nieco inna.

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

W tym wzorze znak zapytania oddziela warunek od wartości, a dwukropek oddziela wartości. Przydziały trzeciorzędne mogą być zagnieżdżane, aby jedna z wartości zawierała inny trzeci.

+1

Ternary ** nie trzeciorzędowy – Joe

+0

@Joe Dzięki za lekcję ortografii –

+1

@ johnny5 to nie jest błąd w pisowni, jest to niewłaściwe słowo. – Murph