Czy w Javascript jest dostępny zerowy operator koalescencyjny?
Na przykład w języku C # mogę to zrobić:
String someString = null;
var whatIWant = someString ?? "Cookies!";
Najlepszym przybliżeniem, jakie mogę znaleźć dla Javascript, jest użycie operatora warunkowego:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
Co jest trochę obrzydliwe IMHO. Czy mogę zrobić lepiej?
javascript
operators
null-coalescing-operator
null-coalescing
Daniel Schaffer
źródło
źródło
x ?? y
składnia ma teraz status wniosku 1 etapu - nieważne łączeniex ?? y
) i opcjonalny operator łańcuchowy (user.address?.street
) są teraz zarówno na etapie 4. Oto dobry opis tego, co to znaczy: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Odpowiedzi:
Aktualizacja
JavaScript obsługuje teraz zerowy operator koalescencji (??) . Zwraca operand po prawej stronie, gdy operand po lewej stronie jest
null
lubundefined
, a w przeciwnym razie zwraca operand po lewej stronie.Przed użyciem sprawdź zgodność.
JavaScriptowy odpowiednik operatora koalescencji zerowej C # (
??
) używa logicznej OR (||
):Istnieją przypadki (wyjaśnione poniżej), że zachowanie nie będzie pasować do zachowania w C #, ale jest to ogólny, zwięzły sposób przypisywania wartości domyślnych / alternatywnych w JavaScript.
Wyjaśnienie
Bez względu na typ pierwszego operandu, jeśli rzutowanie go na wartość logiczną spowoduje
false
, przypisanie użyje drugiego operandu. Uważaj na wszystkie poniższe przypadki:To znaczy:
źródło
||
zwraca pierwszą wartość „truey” lub ostatnią „falsey” (jeśli żadna nie może&&
dać wartości true) i działa w odwrotny sposób: zwraca ostatnią wartość truey lub pierwszą falsey.var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
var value = myObj && myObj.property || ''
cofnie się,''
jeśli myObj lub myObj.property jest fałszem.to rozwiązanie działa jak funkcja koalescencji SQL, przyjmuje dowolną liczbę argumentów i zwraca wartość null, jeśli żadne z nich nie ma wartości. Zachowuje się jak C # ?? operator w tym sensie, że „”, fałsz i 0 są uważane za NIEZEROWANE i dlatego są liczone jako wartości rzeczywiste. Jeśli pochodzisz z tła .net, będzie to najbardziej naturalne rozwiązanie.
źródło
for(var i in arguments)
Nie gwarantuje porządek iteracji, według MDN . Zobacz także Dlaczego JavaScript dla… In loop nie jest zalecany dla tablic? i dlaczego używanie „for… in” z iteracją tablicy jest tak złym pomysłem? .Tak, już wkrótce. Zobacz propozycję tutaj i status realizacji tutaj .
To wygląda tak:
Przykład
źródło
x ?? y
) i opcjonalny operator łańcuchowy (user.address?.street
) są teraz zarówno na etapie 4. Oto dobry opis tego, co to znaczy: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Jeśli
||
jako zamiennik C #??
nie jest wystarczająco dobry w twoim przypadku, ponieważ połyka puste ciągi i zera, zawsze możesz napisać własną funkcję:źródło
false
jeśli (ściśle) null / undefined itrue
inaczej - używając tego z logicznym lub; może być bardziej czytelny niż wiele wywołań funkcji zagnieżdżonych. np.$N(a) || $N(b) || $N(c) || d
jest bardziej czytelny niż$N($N($N(a, b), c), d)
.if .. return .. else ... return
jest idealnym rozwiązaniem dla trójki.return (value === null || value === void 0) ? ifnull : value;
Nikt tu nie wspomniał o potencjale
NaN
, który - dla mnie - jest również wartością zerową. Pomyślałem więc, że dodam moje dwa centy.Dla podanego kodu:
Jeśli miałbyś użyć
||
operatora, otrzymujesz pierwszą nie-fałszywą wartość:Jeśli użyjesz typowej metody koalescencji, jak tutaj zamieszczono , otrzymasz
c
, która ma wartość:NaN
Żadne z tych nie wydaje mi się właściwe. W moim małym świecie logiki koalescencji, który może różnić się od twojego świata, uważam niezdefiniowane, zerowe i NaN za wszystkie „zerowe”. Oczekiwałbym więc powrotu
d
(zero) z metody koalescencji.Jeśli czyjś mózg działa jak mój, a ty chcesz go wykluczyć
NaN
, ta metoda osiągnie to:Dla tych, którzy chcą, aby kod był jak najkrótszy i nie przeszkadzało mu trochę braku jasności, możesz również użyć tego, jak sugeruje @impinball. Wykorzystuje to fakt, że NaN nigdy nie jest równy NaN. Więcej na ten temat możesz przeczytać tutaj: Dlaczego NaN nie jest równe NaN?
źródło
typeof
+num.toString() === 'NaN'
jest nadmiarowy), przechowuj bieżący argument w zmiennej zamiastarguments[i]
.!== 'number'
czek odkąd już ocenione, że nie jestnull
aniundefined
, ale ma to tę zaletę, że każdemu, kto czyta ten kod i stan będzie działać niezależnie od tego, aby bardzo jasne. Twoje pozostałe sugestie nieco skracają kod, więc wykorzystam je.arg !== arg
, ale musisz go miećarg === arg
... to działa. Ma to jednak tę wadę, że jest bardzo niejasne co do tego, co robisz ... wymaga komentarza w kodzie, aby zapobiec usunięciu go przez następną osobę, która przejdzie przez kod i uzna, żearg === arg
jest zbędna ... ale powiem to tak czy siak.strzeż się specyficznej dla JavaScript definicji wartości null. istnieją dwie definicje „brak wartości” w javascript. 1. Null: gdy zmienna ma wartość null, oznacza to, że nie zawiera w niej danych, ale zmienna jest już zdefiniowana w kodzie. lubię to:
w takim przypadku typem twojej zmiennej jest w rzeczywistości Object. Sprawdź to.
Niezdefiniowany: gdy zmienna nie była wcześniej zdefiniowana w kodzie i zgodnie z oczekiwaniami nie zawiera żadnej wartości. lubię to:
w takim przypadku typ zmiennej jest „niezdefiniowany”.
zauważ, że jeśli użyjesz operatora porównującego konwersję typu (==), JavaScript będzie działał jednakowo dla obu tych pustych wartości. aby je rozróżnić, zawsze używaj operatora porównania ścisłego (===).
źródło
var u = undefined;
Po przeczytaniu twojego wyjaśnienia odpowiedź @Ates Goral zapewnia, jak wykonać tę samą operację, którą wykonujesz w C # w JavaScript.
Odpowiedź @ Gumbo zapewnia najlepszy sposób sprawdzenia, czy nie ma wartości null; ważne jest jednak, aby zauważyć różnicę w
==
porównaniu===
z JavaScriptem, szczególnie jeśli chodzi o problemy ze sprawdzaniemundefined
i / lubnull
.Jest to naprawdę dobry artykuł o różnicy w dwóch kategoriach tutaj . Zasadniczo zrozum, że jeśli użyjesz
==
zamiast tego===
, JavaScript spróbuje połączyć wartości, które porównujesz i zwróci wynik porównania po tym połączeniu.źródło
Zauważ, że
create-react-app
łańcuch narzędzi React obsługuje koalescencję zerową od wersji 3.3.0 (wydanej 5.12.2019) . Z informacji o wersji:To powiedziawszy, jeśli używasz
create-react-app
3.3.0+, możesz już dziś zacząć korzystać z operatora zerowej koalescencji w swoich aplikacjach React.źródło
Tak, a jego propozycja to Etap 4 teraz na . Oznacza to, że wniosek jest gotowy do włączenia do formalnego standardu ECMAScript. Możesz go już używać w najnowszych wersjach Chrome, Edge i Firefox na komputery, ale będziemy musieli poczekać trochę dłużej, aż ta funkcja osiągnie stabilność w różnych przeglądarkach.
Spójrz na następujący przykład, aby zademonstrować swoje zachowanie:
Poprzedni przykład jest równoważny z:
Zauważ, że nullish koalescencyjny będzie nie zagrożeń falsy wartości sposobu
||
operator zrobił (nie tylko sprawdzaundefined
czynull
wartości), stąd następujący fragment kodu będzie działał w następujący sposób:Dla użytkowników TypesScript, począwszy od TypeScript 3.7 , ta funkcja jest już dostępna.
źródło
Mamy nadzieję, że wkrótce będzie dostępny w Javascript, ponieważ jest w fazie propozycji od kwietnia 2020. Możesz tutaj monitorować stan pod kątem zgodności i wsparcia - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Reference / Operators / Nullish_coalescing_operator
W przypadku osób korzystających z Typescript możesz użyć zerowego operatora koalescencyjnego z Typescript 3.7
Z dokumentów -
źródło
Dobra odpowiedź
Czy istnieje w JavaScript? Tak. ALE. Obecnie jest na etapie 2020-02-06 na etapie 3 i nie jest jeszcze wszędzie obsługiwany.Kliknij link w poniższym adresie URL i przejdź do nagłówków „Specyfikacje” i „Kompatybilność przeglądarki”, aby uzyskać więcej informacji o tym, gdzie się znajduje.
Cytat z: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
Chcesz przykłady? Kliknij link, który opublikowałem, ma wszystko.
źródło
Teraz ma pełne wsparcie w najnowszej wersji głównych przeglądarek, takich jak Chrome, Edge, Firefox, Safari itp. Oto porównanie między operatorem zerowym i operatorem Nullish Coalescing
źródło