Czy istnieje uniwersalna funkcja JavaScript, która sprawdza, czy zmienna ma wartość i upewnia się, że nie jest, undefined
lub null
? Mam ten kod, ale nie jestem pewien, czy obejmuje on wszystkie przypadki:
function isEmpty(val){
return (val === undefined || val == null || val.length <= 0) ? true : false;
}
(truthy statement) ? true : false;
. Po prostu zrób(truthy statement);
.if (hungry) …
zamiastif (hungry === true) …
. Podobnie jak wszystkie elementy kodujące w ten sposób, to tylko kwestia gustu. Bardziej konkretnie w przykładzie podanym przez OP, mówi jeszcze bardziej dosadnie: „Jeśli to prawda, to prawda, jeśli nie to fałsz”. Ale jeśli to prawda, to już jest prawdą. A jeśli to fałsz, to już jest fałsz. Jest to podobne do powiedzenia „Jeśli jesteś głodny, to jesteś, a jeśli nie, to nie jesteś”.Odpowiedzi:
Możesz po prostu sprawdzić, czy zmienna ma
truthy
wartość, czy nie. To znaczyoceni,
true
czy nievalue
jest :Powyższa lista przedstawia wszystkie możliwe
falsy
wartości w ECMA- / Javascript. Znajdź go w specyfikacji wToBoolean
sekcji.Ponadto, jeśli nie wiesz, czy zmienna istnieje (to znaczy, jeśli została zadeklarowana ), powinieneś sprawdzić u
typeof
operatora. Na przykładJeśli możesz być pewien, że zmienna jest przynajmniej zadeklarowana, powinieneś bezpośrednio sprawdzić, czy ma
truthy
wartość jak pokazano powyżej.Czytaj dalej: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html
źródło
if( value || value === false )
. To samo dotyczy wszystkich wartości fałszowania , musimy je wyraźnie zweryfikować.truthy
może być myląca. W takim przypadku powinniśmy sprawdzić, czyvalue.length != 0
nie jest pusta tablica.if
konstrukt jest składniowo zbyt ciężki, można użyć potrójny operatora, tak jak poniżej:var result = undefined ? "truthy" : "falsy"
. Lub jeśli po prostu chcesz, aby zmusić do wartości logicznej, użyj!!
operatora, na przykład!!1 // true
,!!null // false
.Pełna metoda sprawdzania, czy wartość jest niezdefiniowana, czy null to:
Możesz także użyć
==
operatora, ale wymaga to znajomości wszystkich zasad :źródło
null
czyundefined
można zrobić tak:if (value == null)
. Uważaj na==
operatora, który naciska. Jeśli toif (value === null || value === undefined)
zrobisz, zapomnisz / nie wiesz, jak wymusza Javascript. webreflection.blogspot.nl/2010/10/…arg == null
daje takie same wyniki jakarg === undefined || arg === null
. Uważam jednak ten drugi przykład za bardziej czytelny.arg == null
jest dość powszechne w moim doświadczeniu.return value === (void 0)
jest bezpieczniejsze niż testowanie,undefined
które może być niestety uzasadnioną zmienną w zakresie.To zwróci prawdę dla
i zero funkcji argumentu, ponieważ funkcja
length
jest liczbą deklarowanych parametrów, którą przyjmuje.Aby wyłączyć tę ostatnią kategorię, możesz po prostu sprawdzić puste ciągi znaków
źródło
undefined == null
aleundefined !== null
To jest najbezpieczniejszy czek i nie widziałem go tutaj dokładnie takiego:
Obejmie przypadki, w których wartość nigdy nie została zdefiniowana, a także dowolne z tych:
Edytowano: Zmieniono na ścisłą równość (! ==), ponieważ jest to już norma;)
źródło
typeof
operator zwróci łańcuch, więc użycie ścisłej kontroli równości jest technicznie dokładniejsze, bardziej precyzyjne i szybsze. Tak naprawdę nie ma powodu, aby korzystać z luźnego porównania, a nie na odwrót. Równieżval !== null
w wielu przypadkach jest całkowicie poprawny - robię to cały czas. Zgadzam się z twoim argumentem niezgodności, ale myślę, że jest to słaby przykład, aby sobie z tym poradzić. Nie próbuję cię trollować.Przydatna może być następująca funkcja:
Lub w ES7 (komentarz, jeśli dalsze ulepszenia)
Wyniki:
„Zauważ, że operator bind (: :) nie jest częścią ES2016 (ES7) ani żadnej późniejszej edycji standardu ECMAScript. Jest to obecnie propozycja etapu 0 (strawman) do wprowadzenia do języka.” - Simon Kjellberg. autor pragnie dodać swoje poparcie dla tej pięknej propozycji otrzymania królewskiego wstąpienia.
źródło
::
) nie jest częścią ES2016 (ES7) ani żadnej późniejszej edycji standardu ECMAScript. Obecnie jest to propozycja etapu 0 (strawman) dotycząca wprowadzenia do języka.Pierwsza odpowiedź z najlepszą oceną jest błędna. Jeśli wartość jest niezdefiniowana, spowoduje to wyjątek we współczesnych przeglądarkach. Musisz użyć:
lub
źródło
undefined
wartości.if(value === 0) gameOver();
;)value
wynosi zero, co nie jest tym, czego szuka operacja.Ten warunek sprawdź
to wszystko czego potrzebujesz.
źródło
if
już wykonuje kontrolę fałszowania, którą to po prostu zamienia na wartość logiczną. Czy łapie jakieś przypadki, których normalnyif(foo)
nie łapie?active={!!foo}
! Sprawdź puste ciągi znaków („”), null, undefined, false oraz liczbę 0 i NaN. Powiedz, jeśli ciąg jest pusty,
var name = ""
wówczasconsole.log(!name)
zwracatrue
.funkcja zwróci true, jeśli val jest puste, null, niezdefiniowane, false, liczba 0 lub NaN .
LUB
W zależności od domeny problemu możesz użyć po prostu jak
!val
lub!!val
.źródło
isEmpty(val)
jeśli możesz to zrobić!val
?!val
lub w!!val
zależności od domeny problemu.Rozwiązanie, które bardzo lubię:
Zdefiniujmy, że pusta zmienna ma wartość
null
lubundefined
, lub jeśli ma długość, jest równa zero lub jeśli jest obiektem, nie ma kluczy:Zwroty:
undefined
,null
,""
,[]
,{}
true
,false
,1
,0
,-1
,"foo"
,[1, 2, 3]
,{ foo: 1 }
źródło
Trochę przesadzasz. Aby sprawdzić, czy zmienna nie ma wartości, wystarczy sprawdzić przed niezdefiniowanym i zerowym.
Zakłada się
0
, że""
obiekty (nawet pusty obiekt i tablica) są prawidłowymi „wartościami”.źródło
Jeśli wolisz zwykły JavaScript, spróbuj tego:
W przeciwnym razie, jeśli już używasz podkreślenia lub lodash, spróbuj:
źródło
_.isNil
jest funkcja, której szukasz_.isEmpty
. Dokumentacja isNil , dokumentacja isEmptyisArray
lub nieisString
działa nawindow
.Oto moja - zwraca true, jeśli wartość jest pusta, niezdefiniowana itp. Lub pusta (tzn. Zawiera tylko puste spacje):
źródło
jest naprawdę fajnym i czystym sposobem radzenia sobie z nim w wielu miejscach, można go również używać do przypisywania zmiennych
źródło
true
i starasz się dostarczyć lub zwrócival
zfalse
.const res = falsyValue ? true : falsyValue
Jeśli zmienna nie została zadeklarowana, nie będzie możliwe sprawdzenie niezdefiniowanej za pomocą funkcji, ponieważ pojawi się błąd.
Oba wygenerują błąd, jeśli foo nie zostanie zadeklarowane.
Jeśli chcesz sprawdzić, czy zmienna została zadeklarowana, możesz użyć
jeśli chcesz sprawdzić, czy foo zostało zadeklarowane i ma wartość, której możesz użyć
źródło
Aby sprawdzić wartość domyślną
sprawdź Wynik:
Użyłem funkcji @Vix (), aby sprawdzić obiekt tego typu.
za pomocą instansof «
źródło
// Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
W ES6 z wykończeniem do obsługi ciągów białych znaków:
źródło
Może się przydać.
Wszystkie wartości w tablicy reprezentują to, czym chcesz być (null, undefined lub inne rzeczy) i wyszukujesz w niej to, co chcesz.
źródło
Jeśli używasz
TypeScript
i nie chcesz uwzględniać „wartości, sąfalse
” oto rozwiązanie dla Ciebie:Pierwszy:
import { isNullOrUndefined } from 'util';
Następnie:
isNullOrUndefined(this.yourVariableName)
Uwaga: jak wspomniano poniżej, to jest już przestarzałe, użyj
value === undefined || value === null
zamiast tego. ref .źródło
/** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
typescript
coś. Czy możesz podać link do jego dokumentacji?Próżnia
Nie polecam próbować definiować ani używać funkcji, która oblicza, czy jakaś wartość na całym świecie jest pusta. Co to tak naprawdę znaczy być „pustym”? Jeśli tak
let human = { name: 'bob', stomach: 'empty' }
, czy powinienemisEmpty(human)
wrócićtrue
? Jeśli taklet reg = new RegExp('');
, czy powinienemisEmpty(reg)
wrócićtrue
? Co zisEmpty([ null, null, null, null ])
- ta lista zawiera tylko pustkę, więc czy sama lista jest pusta? Chcę przedstawić tutaj kilka uwag na temat „próżności” (słowo celowo niejasne, aby uniknąć wcześniejszych skojarzeń) w javascript - i chcę argumentować, że „próżności” w wartościach javascript nigdy nie należy traktować ogólnie.Prawdomówność / fałsz
Aby zdecydować, w jaki sposób określić „próżność” wartości, musimy uwzględnić wbudowane, javascriptowe nieodłączne poczucie, czy wartości są „prawdą”, czy „fałszem”. Oczywiście
null
iundefined
oba są „falsy”. Mniej naturalnie liczba0
(i żadna inna liczba opróczNaN
) jest również „fałszem”.''
Przynajmniej naturalnie: jest fałszem, ale[]
i{}
(inew Set()
, inew Map()
) są prawdomówne - chociaż wszystkie wydają się równie próżne!Null vs Undefined
Trwa także dyskusja na temat
null
vsundefined
- czy naprawdę potrzebujemy obu, aby wyrazić pustkę w naszych programach? Osobiście unikam, aby litery u, n, d, e, f, i, n, e, d pojawiały się w moim kodzie w tej kolejności. Zawsze używamnull
do oznaczenia „próżności”. Ponownie, choć musimy pomieścić Javascript w przyrodzone poczucie jaknull
iundefined
różnią się:undefined
undefined
:undefined
, gdy są podane , a nienull
:Nieogólna próżnia
Uważam, że pustki nigdy nie powinny być traktowane w sposób ogólny. Zamiast tego powinniśmy zawsze dokładać starań, aby uzyskać więcej informacji o naszych danych przed ustaleniem, czy są one puste - robię to głównie poprzez sprawdzenie, z jakim typem danych mam do czynienia:
Zauważ, że ta funkcja ignoruje polimorfizm - oczekuje
value
się, że będzie to bezpośrednia instancjaCls
, a nie instancja podklasyCls
. Unikaminstanceof
z dwóch głównych powodów:([] instanceof Object) === true
(„Tablica to obiekt”)('' instanceof String) === false
(„Ciąg nie jest ciągiem”)Zauważ, że
Object.getPrototypeOf
jest używany, aby uniknąć przypadku takiego jaklet v = { constructor: String };
.isType
Funkcja nadal zwraca poprawnie dlaisType(v, String)
(fałsz) iisType(v, Object)
(prawda).Ogólnie polecam korzystanie z tej
isType
funkcji wraz z następującymi wskazówkami:let v = JSON.parse(someRawValue);
Naszav
zmienna jest teraz nieznanego typu. Jak najwcześniej powinniśmy ograniczyć nasze możliwości. Najlepszym sposobem na to może być wymaganie określonego typu: np.if (!isType(v, Array)) throw new Error('Expected Array');
- jest to naprawdę szybki i ekspresyjny sposób na usunięcie ogólnej naturyv
i zapewnienie, że zawsze będzieArray
. Czasami jednak musimy pozwolićv
na bycie wielu typów. W takich przypadkachv
jak najwcześniej powinniśmy utworzyć bloki kodu, które nie są już ogólne.if (v === null) throw new Error('Null value rejected');
- to jest wielki dla zapewnienia, żenull
wartości nie zrobić to przez, ale jeśli to jest wartość nie zrobić to przez, wciąż wiemy mało cokolwiek na ten temat. Wartość,v
która przejdzie kontrolę zerową, jest nadal BARDZO ogólna - to nic innegonull
! Czarne listy prawie nie rozpraszają ogólności.O ile wartość nie jest
null
, nigdy nie uważaj „wartości pustej”. Zamiast tego rozważ „X, który jest pusty”. Zasadniczo nigdy nie rozważaj robienia czegoś podobnegoif (isEmpty(val)) { /* ... */ }
- bez względu na to, jak taisEmpty
funkcja jest zaimplementowana (nie chcę wiedzieć ...), to nie ma znaczenia! I to jest zbyt ogólne! Wakat należy obliczać tylko przy znajomościval
rodzaju. Kontrole próżni powinny wyglądać następująco:if (isType(val, String) && val.length === 0) ...
if (isType(val, Object) && Object.entries(val).length === 0) ...
if (isType(val, Number) && val <= 0) ...
„Tablica bez przedmiotów”:
if (isType(val, Array) && val.length === 0) ...
Jedynym wyjątkiem jest sytuacja, gdy
null
jest używany do oznaczenia określonej funkcjonalności. W tym przypadku sensowne jest powiedzenie: „Pusta wartość”:if (val === null) ...
źródło
Spróbuj z inną logiką . Możesz użyć poniższego kodu do sprawdzenia wszystkich czterech (4) warunków sprawdzania poprawności, takich jak: nie jest pusty, nie jest pusty, nie jest niezdefiniowany i nie zero używa tylko tego kodu (! (! (Zmienna))) w javascript i jquery.
źródło
Możesz myśleć o tej funkcji -
??
operatorze - jako o „powrocie” do wartości domyślnej w przypadkunull
lubundefined
.Ponownie powyższy kod jest równoważny z poniższym.
źródło
ale to rozwiązanie jest przeprojektowane, jeśli nie chcesz później modyfikować funkcji dla potrzeb modelu biznesowego, wtedy łatwiej jest użyć jej bezpośrednio w kodzie:
źródło
To nigdy nie spowoduje błędu. Jeśli myObject , child lub myValue ma wartość NULL, to myNewValue będzie miało wartość NULL. Błędy nie będą zgłaszane
źródło
Dla wszystkich, którzy przychodzą tutaj z podobnym pytaniem, następujące działa świetnie i mam je w mojej bibliotece w ostatnich latach:
źródło
Jeśli chcesz uniknąć spełnienia warunku, jeśli wartość jest dowolna z poniższych, zgodnie z odpowiedzią jAndy :
Jednym z możliwych rozwiązań, które mogą uniknąć uzyskania prawdziwych wartości, są następujące:
Byłby używany w następujący sposób:
Oprócz tych scenariuszy warto zwrócić wartość false, jeśli obiekt lub tablica jest pusta:
Poradziłbyś sobie w ten sposób:
Jeśli chcesz sprawdzić wszystkie ciągi białych znaków („”), możesz wykonać następujące czynności:
Uwaga:
hasOwnProperty
zwraca true dla pustych ciągów, 0, false, NaN, null i undefined, jeśli zmienna została zadeklarowana jako dowolna z nich, więc może nie być najlepszym wyborem. Funkcja może zostać zmodyfikowana w celu użycia jej w celu pokazania, że została zadeklarowana, ale nie jest użyteczna.źródło
Kod na GitHub
Testy biednych ludzi 😁
Wyniki testów:
źródło
value.constructor === Object
? Sprawdź to .value.constructor === Object
jest w porządku, w javascript JEŻELI instrukcje OR mają kolejność wykonywania, dzięki czemu instrukcja OR będzie wykonywana tylko wtedy, gdy poprzednie nie zwróciło PRAWDA, a my już sprawdziliśmyNull
. W rzeczywistości jedynym celem tej ostatniej instrukcji OR jest wykrycie{}
i upewnienie się, że nie zwraca PRAWDA dla rzeczy, których nie powinna.To sprawdzi, czy zmienna nieokreślonego zagnieżdżenia jest niezdefiniowana
Powyższe sprawdza, czy istnieje funkcja tłumaczenia Google TranslateElement. Jest to równoważne z:
źródło
Opcjonalny operator łączenia łańcuchowego umożliwia uproszczenie dostępu do wartości przez połączone obiekty, gdy możliwe jest, że odwołanie lub funkcja mogą być niezdefiniowane lub mieć wartość zerową.
Zerowy operator koalescencyjny może być użyty po opcjonalnym łańcuchowaniu w celu zbudowania wartości domyślnej, gdy nie zostanie znaleziony:
źródło
sprawdzi także białe spacje ('') wraz z następującymi:
źródło
Myślę, że za pomocą? operator jest nieco czystszy.
źródło