Pytanie Czy istnieje standardowa funkcja do sprawdzania zmiennych zerowych, niezdefiniowanych lub pustych w JavaScript?


Czy istnieje uniwersalna funkcja JavaScript, która sprawdza, czy zmienna ma wartość i czy jej nie ma 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;
}

1609
2018-04-01 15:14


pochodzenie


możliwy duplikat Jak sprawdzić pusty ciąg w JavaScript? - Dour High Arch
Zrobiłem skrzypce do testowania: jsfiddle.net/J7m7m/886 - D-Money
Protip, nigdy nie rób tego (truthy statement) ? true : false;. Po prostu zrób (truthy statement);. - David Baucum
Możliwy duplikat Jak sprawdzić pusty ciąg w JavaScript? - George Jempty
@GeorgeJempty nie dup, ponieważ druga odpowiedź pyta smyczki w szczególności, o ile ten pyta zmienne. - Madbreaks


Odpowiedzi:


Możesz po prostu sprawdzić, czy zmienna ma truthy wartość lub nie. To znaczy

if( value ) {
}

oceni na true gdyby value jest nie:

  • zero
  • niezdefiniowany
  • NaN
  • pusta struna ("")
  • 0
  • fałszywy

Powyższa lista przedstawia wszystkie możliwe falsy wartości w ECMA- / Javascript. Znajdź to w specyfikacja na ToBoolean Sekcja.

Ponadto, jeśli nie wiedzieć czy istnieje zmienna (to znaczy, jeśli takowa była zdeklarowany) powinieneś sprawdzić przy pomocy typeof operator. Na przykład

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

Jeśli możesz być pewien, że zmienna jest deklarowana co najmniej, powinieneś bezpośrednio sprawdzić, czy ma truthy wartość jak pokazano powyżej.

Więcej informacji: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html


3313
2018-04-01 15:17



Co jeśli wartość jest fałszywą wartością logiczną, która była zamierzona. Czasem chcesz podać wartość domyślną, jeśli nie ma wartości, która nie zadziała, jeśli zostanie przekazana wartość false boolean. - TruMan1
@ TruMan1: w takim przypadku (gdzie twoja logika dyktuje walidację) musisz iść if( value || value === false ). To samo dotyczy wszystkich wartości falsy, musimy jawnie potwierdzić dla tych osób. - jAndy
Z wyjątkiem sytuacji, gdy wartością jest tablica. Interpretacja truthy może wprowadzać w błąd. W takim przypadku powinniśmy sprawdzić value.length != 0 dla niepustej tablicy. - user
Po prostu chcę dodać, że jeśli czujesz if konstrukcja jest syntaktycznie za ciężka, możesz użyć operatora potrójnego, jak poniżej: var result = undefined ? "truthy" : "falsy". Lub jeśli chcesz po prostu zmusić do wartości boolowskiej, użyj !! operator, np. !!1 // true, !!null // false. - KFL
Zwróć też uwagę, że nie będzie to oznaczało ciągów, które zawierają tylko białe znaki. - Christophe Roussy


Pełną metodą sprawdzenia, czy wartość jest niezdefiniowana, czy pustą, jest:

return value === undefined || value === null;

Możesz także użyć == operatora, ale tego oczekuje znać wszystkie zasady:

return value == null; // also returns true if value is undefined

151
2018-04-01 15:20



Sprawdzanie tylko null lub undefined można zrobić tak: if (value == null). Zważ na == operator, który wymusza. Jeśli to sprawdzisz if (value === null || value === undefined), zapomniałeś / nie wiesz, jak wymusza JavaScript. webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek
@ Christristian Westerbeek: twoja uwaga, że arg == null daje takie same wyniki jak arg === undefined || arg === null. Jednak uważam ten drugi przykład za bardziej czytelny. - Salman A
arg == null jest dość powszechny w moim doświadczeniu. - Bryan Downing
return value === (void 0) jest bezpieczniejsze niż testowanie przeciwko undefined która może być uzasadnioną zmienną w zakresie, niestety. - x0n
@Sharky Istnieje różnica pomiędzy zmienną, która jest niezdefiniowana i niezadeklarowaną zmienną: lucybain.com/blog/2014/null-undefined-undeclared - Christiaan Westerbeek


function isEmpty(value){
  return (value == null || value.length === 0);
}

To się spełni

undefined  // Because undefined == null

null

[]

""

i zero argumentów funkcji od funkcji length to liczba zadeklarowanych parametrów, które bierze.

Aby odrzucić tę ostatnią kategorię, możesz po prostu sprawdzić puste ciągi

function isEmpty(value){
  return (value == null || value === '');
}

55
2018-04-01 15:19



undefined == null ale undefined !== null - Ian Boyd
@IanBoyd to dlatego, że porównujesz == do ===. oznacza to, że undefined == null (true) undefined! = null (false) undefined === null (false) undefined! == null (true) byłoby lepiej podać nieco więcej informacji, aby być pomocnym i popychać ludzi w dobrym kierunku. moz doc na różnicy developer.mozilla.org/en-US/docs/Web/JavaScript/... - Corey Young
@AdamLeggett, prawda nie wchodzi w to. - Mike Samuel
Przepraszam, źle odczytałem. - Adam Leggett


Wiem, że to stare pytanie, ale jest to najbezpieczniejszy sprawdzian i nie widziałem go tutaj dokładnie tak:

if (typeof value != 'undefined' && value) {
    //deal with value'
};

Obejmie przypadki, w których wartość nigdy nie został zdefiniowany, a także którykolwiek z poniższych:

  • zero
  • undefined (wartość undefined to nie to samo, co parametr, który nigdy nie był zdefiniowany)
  • 0
  • "" (pusta struna)
  • fałszywy
  • NaN

P.S. nie ma potrzeby ścisłej równości w typeof value! = 'undefined'


26
2017-11-10 16:13



Co słychać w trakcie głosowania ?! Jakiś fanatyk równości w domu. Och, czekaj, powiedziano ci, żeby zawsze stosować ścisłą równość i zawsze robisz to, co ci powiedziano, prawda? - guya
Nie spadłem, ale w odniesieniu do ścisłego porównania równości, ogólna zasada jest taka, że ​​jeśli ty potrzeba należy stosować domyślną konwersję typu niż ścisłe porównanie. - J.Steve
Dziękuję za komentarz Steve. Ta ogólna zasada jest w porządku. Po prostu oczekuję, że ppl zrozumie, dlaczego używają jednego lub drugiego. Każdy sposób, w jaki wyglądasz, będzie zadowolony, że będzie cię głosił o "zawsze zawsze używaj surowych" - tak jak to jest najważniejsze w JavaScript. Widziałem zbyt wiele takich przypadków if (val! == null) co oczywiście prowadzi do niechcianego wyniku. Można powiedzieć, że w razie wątpliwości należy stosować ścisłe, ale lepiej nie mieć wątpliwości. - guya
Myślę, że chodzi o to, że oczekujemy typeof operator zwraca ciąg, więc użycie ścisłej kontroli równości jest technicznie bardziej dokładne, bardziej szczegółowe i szybsze. Tak naprawdę, nie ma powodu, aby używać luźnego porównania, a nie na odwrót. Również val !== null jest doskonale ważny w wielu przypadkach - robię to cały czas. Zgadzam się z pańskim argumentem dotyczącym braku zgodności, ale uważam, że jest to zły przykład, aby to osiągnąć. Nie próbuję cię trollować. - Bryan Downing
Dziękuję za komentarz Bryan, Używasz val! == null, ponieważ wiesz, co robisz. Początkujący będą chcieli mieć awarię, gdy val jest fałszywy. Ale val nigdy nie będzie miało wartości NULL, będzie niezdefiniowane. Gdyby tylko nie słuchał tej rady "zawsze zawsze używaj surowych", będzie miał mniej błędów. Widziałem, jak to się dzieje w kodzie produkcyjnym. typeof zawsze zwraca ciąg znaków, a różnica prędkości będzie nadmiarowa. Tak więc jedynym argumentem przemawiającym za użyciem ścisłego w powyższym przypadku jest spójność. Powiedziałem: "Nie ma potrzeby ścisłej równości". Nie oznacza to, że nie możesz tego zrobić, jeśli chcesz, lub jeśli Twój kod jest bardziej spójny. - guya


Pierwsza odpowiedź z najlepszą oceną jest błędna. Jeśli wartość jest niezdefiniowana, rzuci wyjątek w nowoczesnych przeglądarkach. Musisz użyć:

if (typeof(value) !== "undefined" && value)

lub

if (typeof value  !== "undefined" && value)

25
2018-03-19 13:23



eee ... Myślę, że jest źle, jakby (wartość) była wystarczająca (z wyjątkiem pustych obiektów / tablic). jeśli wartość jest "nieokreślona", nie dojdzie do konfuzji "jeśli". - Oskar Szura
To łączy zmienne, które nie są zdefiniowane (które rzucają ReferenceError na ocenę), które różnią się od zmiennych z undefined wartość. - Qantas 94 Heavy
Mam ten sam błąd tutaj. if (x), if (! x), if (!! x) spowoduje błąd, jeśli x jest niezdefiniowane. - shaosh
if(value === 0) gameOver();  ;) - Madbreaks
Ta odpowiedź jest również błędna, ponieważ zwraca wartość false, gdy value jest zero, czyli jest nie czego szuka op. - Madbreaks


Może Ci się przydać przydatna następująca funkcja:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

Lub w ES7 (komentarz, czy dalsze ulepszenia)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

Wyniki:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date

"Zauważ, że operator powiązania (: :) nie jest w ogóle częścią ES2016 (ES7) ani żadnej późniejszej wersji standardu ECMAScript, jest to obecnie propozycja etapu 0 (strawman) dla wprowadzenia do tego języka." - Simon Kjellberg. autor pragnie dodać swoje poparcie dla tej pięknej propozycji, by otrzymać królewskie wniebowstąpienie.


23
2018-02-12 10:32



+1 pomocne jest poznanie obiektu typu "wyrejestruj", "tablica" i "funkcja" - Yash
@Vix, dlaczego wersja ES7 jest lepsza? - GollyJer
Nie jest, eksperymentował z bardziej czytelnymi sposobami wyrażania tej samej funkcjonalności przy użyciu: destructuring assignment, bind operator. - Vix
Zwróć uwagę, że operator wiązania (::) w ogóle nie jest częścią ES2016 (ES7) ani późniejszej wersji standardu ECMAScript. Jest to obecnie propozycja etapu 0 (strawman) do wprowadzenia do języka. - Simon Kjellberg


! sprawdź puste ciągi znaków (""), null, undefined, false oraz liczbę 0 i NaN. Powiedz, jeśli ciąg znaków jest pusty var name = "" następnie console.log(!name) zwraca true.

function isEmpty(val){
  return !val;
}

ta funkcja zwróci wartość true, jeśli val jest pusty, null, undefined, false, liczba 0 lub NaN.


16
2018-01-23 06:56



To tak naprawdę nie mówi, czy zmienna jest pusta, ponieważ wartość false i 0 mogą być poprawnymi wartościami i nie stanowią pustej wartości. Wartość funkcji isEmpty polega na upewnieniu się, że wartości, które są puste, zwracają true. moim zdaniem wartość null, undefined, NaN i pusty ciąg są wartościami, które mają sens jako puste. - Corey Young
Dlaczego warto korzystać isEmpty(val) jeśli możesz po prostu zrobić !val? - Allen Linatoc
To zależy od Ciebie. Możesz go użyć, aby zwiększyć czytelność. W przeciwnym razie, jeśli uważasz, że zespół, który pracujesz, jest bardziej zaawansowanym koderem, możesz go użyć po prostu !val lub !!val zgodnie z twoją domeną problemów. - Arif


Trochę przesadzasz z tym. Aby sprawdzić, czy zmienna nie ma wartości, wystarczy sprawdzić wartość undefined i wartość null.

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

Zakłada się 0, "", a obiekty (nawet pusty obiekt i tablica) są poprawnymi "wartościami".


10
2018-04-01 15:21



Sprawdzanie tylko null lub undefined można zrobić tak: if (value == null). Zważ na == operator, który wymusza. Jeśli to sprawdzisz if (value === null || value === undefined), zapomniałeś / nie wiesz, jak wymusza JavaScript. webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek