Sprawdzanie, czy coś jest puste w Javascript?

85

Jak mogę sprawdzić, czy zmienna jest pusta w JavaScript? Przepraszam za głupie pytanie, ale jestem nowicjuszem w Javascript!

if(response.photo) is empty {
    do something
else {
    do something else
}

response.photopochodzi z formatu JSON i czasami może być pusty, puste komórki danych! Chcę sprawdzić, czy jest pusty.

Jhon Woodwrick
źródło
2
Co oznacza tutaj „pusty”? Jeśli nie jesteś pewien, pokaż nam kod.
thejh
1
Czy masz na myśli, że jest jeszcze niezainicjowany?
Franz Payer
1
Masz na myśli, czy to się ocenia false?
Felix Kling
2
Masz na myśli, czy to jest pusty ciąg?
Mark Byers,
Oto implementacja funkcji PHPs w języku JavaScript empty()w bardziej czytelny sposób. stackoverflow.com/a/33319704/3779853
phil294

Odpowiedzi:

134

Jeśli testujesz pod kątem pustego ciągu:

if(myVar === ''){ // do stuff };

Jeśli szukasz zmiennej, która została zadeklarowana, ale nie została zdefiniowana:

if(myVar === null){ // do stuff };

Jeśli szukasz zmiennej, która nie może być zdefiniowana:

if(myVar === undefined){ // do stuff };

Jeśli sprawdzasz obie wartości tj., Każda ze zmiennych ma wartość null lub undefined:

if(myVar == null){ // do stuff };
brettkelly
źródło
4
Nie używaj undefined„stałej”, ponieważ wcale nie jest stała. Użyj typeof myVar === 'undefined'zamiast tego.
Guffa
3
Nie. Jeśli zmienna została zadeklarowana, ale nie została zdefiniowana, nie jest pusta ... jest niezdefiniowana. Jeśli sprawdzisz zmienną, która nie została zadeklarowana, pojawi się błąd wykonania. Również var undefined = 1;złamie twój trzeci przykład. Zawsze używaj typeofi sprawdzaj "undefined".
gilly3
@Jhon Woodwrick: To byłby pierwszy przypadek, pusty ciąg.
thejh
2
if(typeof variable === "undefined")
ncubica
Dzięki za pomoc
phani
52

To ważniejsze pytanie niż myślisz. Zmienne mogą być opróżniane na wiele sposobów. Rodzaj zależy od tego, co musisz wiedzieć.

// quick and dirty will be true for '', null, undefined, 0, NaN and false.
if (!x) 

// test for null OR undefined
if (x == null)  

// test for undefined OR null 
if (x == undefined) 

// test for undefined
if (x === undefined) 
// or safer test for undefined since the variable undefined can be set causing tests against it to fail.
if (typeof x == 'undefined') 

// test for empty string
if (x === '') 

// if you know its an array
if (x.length == 0)  
// or
if (!x.length)

// BONUS test for empty object
var empty = true, fld;
for (fld in x) {
  empty = false;
  break;
}
Cykuta
źródło
@Tomalak Ups, dzięki. Myślę, że potrójne równe jest jednak opcjonalne. Typ zwróci łańcuch, nic nie zostanie wymuszone.
Hemlock,
To prawda. W każdym razie kontrola tożsamości nie boli, jak sądzę. :-)
Tomalak
1
(! x) będzie również prawdziwe dla NaN i []. (x == null) jest testem dla wartości null lub undefined.
Patrick Fisher
1
Racja, zapomniałem o NaN. Nie zdawałem sobie sprawy, że test na wartość null działał tak samo, jak test na wartość undefined. !xnie jest jednak prawdziwe dla pustej tablicy.
Hemlock,
11

Powinno to obejmować wszystkie przypadki:

function empty( val ) {

    // test results
    //---------------
    // []        true, empty array
    // {}        true, empty object
    // null      true
    // undefined true
    // ""        true, empty string
    // ''        true, empty string
    // 0         false, number
    // true      false, boolean
    // false     false, boolean
    // Date      false
    // function  false

        if (val === undefined)
        return true;

    if (typeof (val) == 'function' || typeof (val) == 'number' || typeof (val) == 'boolean' || Object.prototype.toString.call(val) === '[object Date]')
        return false;

    if (val == null || val.length === 0)        // null or 0 length array
        return true;

    if (typeof (val) == "object") {
        // empty object

        var r = true;

        for (var f in val)
            r = false;

        return r;
    }

    return false;
}
szczeniak plutona
źródło
5

Widzę potencjalne braki w wielu zamieszczonych powyżej rozwiązaniach, dlatego zdecydowałem się skompilować własne.
Uwaga: używa Array.prototype.some , sprawdź obsługę przeglądarki.

Poniższe rozwiązanie uznaje zmienną za pustą, jeśli spełniony jest jeden z poniższych warunków:

  1. JS uważa, że zmienna jest równa false, która obejmuje już wiele rzeczy, jak 0, "", [], a nawet [""]i[0]
  2. Wartość to nulllub jej typ to'undefined'
  3. To jest pusty obiekt
  4. Jest to obiekt / tablica składająca się tylko z wartości, które same są puste (tj. Podzielone na prymitywy, każda jego część jest równa false). Sprawdza drążenie rekurencyjnie w strukturze Object / Array. Na przykład

    isEmpty({"": 0}) // true
    isEmpty({"": 1}) // false
    isEmpty([{}, {}])  // true
    isEmpty(["", 0, {0: false}]) //true
    

Kod funkcji:

/**
 * Checks if value is empty. Deep-checks arrays and objects
 * Note: isEmpty([]) == true, isEmpty({}) == true, isEmpty([{0:false},"",0]) == true, isEmpty({0:1}) == false
 * @param value
 * @returns {boolean}
 */
function isEmpty(value){
  var isEmptyObject = function(a) {
    if (typeof a.length === 'undefined') { // it's an Object, not an Array
      var hasNonempty = Object.keys(a).some(function nonEmpty(element){
        return !isEmpty(a[element]);
      });
      return hasNonempty ? false : isEmptyObject(Object.keys(a));
    }

    return !a.some(function nonEmpty(element) { // check if array is really not empty as JS thinks
      return !isEmpty(element); // at least one element should be non-empty
    });
  };
  return (
    value == false
    || typeof value === 'undefined'
    || value == null
    || (typeof value === 'object' && isEmptyObject(value))
  );
}
Oleksii Chekulaiev
źródło
Miły. Możesz wskazać różnice i sposób, w jaki spełnia on również zidentyfikowane przez Ciebie niedociągnięcia.
Shawn Mehan
1
Musiałbym powtórzyć wszystkie decyzje tutaj. Dobrze. W porównaniu z @victorkohl i @kapa funkcje moje mogą sięgać głębiej niż pierwszy poziom i raportować złożone obiekty, które wyglądają na niepuste, ale w rzeczywistości składają się tylko z wartości podobnych do pustych. Przykład: [{},0,""]. Wszystkie inne rozwiązania są tutaj tylko dwoma wierszami, które nie idą na odległość, i funkcją podkreślenia, która działa dla obiektów i wymaga biblioteki lib.
Oleksii Chekulaiev
4

Tutaj moje najprostsze rozwiązanie.

Zainspirowany funkcją PHP empty

function empty(n){
	return !(!!n ? typeof n === 'object' ? Array.isArray(n) ? !!n.length : !!Object.keys(n).length : true : false);
}

//with number
console.log(empty(0));        //true
console.log(empty(10));       //false

//with object
console.log(empty({}));       //true
console.log(empty({a:'a'}));  //false

//with array
console.log(empty([]));       //true
console.log(empty([1,2]));    //false

//with string
console.log(empty(''));       //true
console.log(empty('a'));      //false

Prabu samvel
źródło
3

Zobacz http://underscorejs.org/#isEmpty

isEmpty_.isEmpty (object) Zwraca wartość true, jeśli wyliczalny obiekt nie zawiera żadnych wartości (brak wyliczalnych właściwości własnych). W przypadku ciągów znaków i obiektów podobnych do tablic _.isEmpty sprawdza, czy właściwość length ma wartość 0.

Lo HaBuyshan
źródło
3

Łączenie odpowiedzi z @inkednm w jedną funkcję:

   function isEmpty(property) {
      return (property === null || property === "" || typeof property === "undefined");
   }
Crashalot
źródło
Użyj property == nulldo połączonego czeku nulliundefined
SJ00
3

Puste sprawdzenie klucza JSON zależy od przypadku użycia. W przypadku typowego przypadku użycia możemy przetestować następujące elementy:

  1. Nie null
  2. Nie undefined
  3. To nie jest pusty ciąg ''
  4. To nie jest pusty obiekt {} [] (tablica jest obiektem)

Funkcjonować:

function isEmpty(arg){
  return (
    arg == null || // Check for null or undefined
    arg.length === 0 || // Check for empty String (Bonus check for empty Array)
    (typeof arg === 'object' && Object.keys(arg).length === 0) // Check for empty Object or Array
  );
}

Zwrot true dla:

isEmpty(''); // Empty String
isEmpty(null); // null
isEmpty(); // undefined
isEmpty({}); // Empty Object
isEmpty([]); // Empty Array
SJ00
źródło
2

po prostu umieść zmienną w warunku if, jeśli zmienna ma jakąkolwiek wartość, zwróci wartość true lub false.

if (response.photo){ // if you are checking for string use this if(response.photo == "") condition
 alert("Has Value");
}
else
{
 alert("No Value");
};
Deepak MS
źródło
Zakłada się, że „pusty” oznacza zero… ale z pytania Pytającego nie wynika, że ​​właśnie to mieli na myśli. Prawdopodobnie lepiej to najpierw wyjaśnić, zanim zaoferujesz odpowiedź, lub przynajmniej podać to jako założenie w swojej odpowiedzi.
Mir
1

A co z takim robieniem?

JSON.stringify({}) === "{}"

Tibin Thomas
źródło
0

To zależy od tego, co masz na myśli mówiąc „pusty”. Najpopularniejszym wzorcem jest sprawdzenie, czy zmienna jest niezdefiniowana . Wiele osób sprawdza również wartość zerową, na przykład:
if (myVariable === undefined || myVariable === null)...

lub w krótszej formie:
if (myVariable || myVariable === null)...

Bobby D.
źródło
Nie używaj undefined„stałej”, ponieważ wcale nie jest stała. Użyj typeof myVar === 'undefined'zamiast tego.
Guffa,
Te dwie formy wcale nie są takie same.
kapa
To prawda, istnieje niezdefiniowany typ, ale aby zacytować standard: Odniesienie jest rozwiązanym wiązaniem nazwy. Odniesienie składa się z trzech składników, wartości bazowej, nazwy, do której się odwołuje, oraz flagi ścisłego odwołania o wartości logicznej. Wartość podstawowa to undefined, Object, Boolean, String, Number lub environment record (10.2.1). Wartość podstawowa undefined wskazuje, że odwołanie nie może zostać przekształcone w powiązanie.
Bobby D
0
if (myVar == undefined)

będzie działać, aby sprawdzić, czy var jest zadeklarowany, ale nie zainicjowany.

Franz Payer
źródło
1
Jest to niebezpieczne, ponieważ undefinedmożna je przedefiniować w kodzie (tj. undefined = trueJest ważne).
Tomalak
Nie używaj undefined„stałej”, ponieważ wcale nie jest stała. Użyj typeof myVar === 'undefined'zamiast tego.
Guffa,
0

Sprawdź niezdefiniowane:

if (typeof response.photo == "undefined")
{
    // do something
}

To byłoby równoważne z czasownikiem IsEmpty. Jeśli myvar zawiera jakąkolwiek wartość, nawet null, pusty ciąg lub 0, nie jest „pusty”.

Aby sprawdzić, czy zmienna lub właściwość istnieje, np. Została zadeklarowana, chociaż nie została jeszcze zdefiniowana, możesz użyć inoperatora.

if ("photo" in response)
{
    // do something
}
gilly3
źródło
0

Jeśli szukasz odpowiednika funkcji PHP empty, sprawdź to:

function empty(mixed_var) {
  //   example 1: empty(null);
  //   returns 1: true
  //   example 2: empty(undefined);
  //   returns 2: true
  //   example 3: empty([]);
  //   returns 3: true
  //   example 4: empty({});
  //   returns 4: true
  //   example 5: empty({'aFunc' : function () { alert('humpty'); } });
  //   returns 5: false

  var undef, key, i, len;
  var emptyValues = [undef, null, false, 0, '', '0'];

  for (i = 0, len = emptyValues.length; i < len; i++) {
    if (mixed_var === emptyValues[i]) {
      return true;
    }
  }

  if (typeof mixed_var === 'object') {
    for (key in mixed_var) {
      // TODO: should we check for own properties only?
      //if (mixed_var.hasOwnProperty(key)) {
      return false;
      //}
    }
    return true;
  }

  return false;
}

http://phpjs.org/functions/empty:392

kapa
źródło
0

Czego mi brakuje, jeśli pusta tablica ... obiekt bezkluczykowy ... fałszywość const isEmpty = o => Array.isArray (o) &&! o.join (''). length || typeof o === 'object' &&! Object.keys (o) .length || ! (+ wartość);

PDA
źródło
0

Oto prostsze (krótkie) rozwiązanie sprawdzania pustych zmiennych. Ta funkcja sprawdza, czy zmienna jest pusta. Podana zmienna może zawierać wartości mieszane (null, undefined, array, object, string, integer, function).

function empty(mixed_var) {
 if (!mixed_var || mixed_var == '0') {
  return true;
 }
 if (typeof mixed_var == 'object') {
  for (var k in mixed_var) {
   return false;
  }
  return true;
 }
 return false;
}

//   example 1: empty(null);
//   returns 1: true

//   example 2: empty(undefined);
//   returns 2: true

//   example 3: empty([]);
//   returns 3: true

//   example 4: empty({});
//   returns 4: true

//   example 5: empty(0);
//   returns 5: true

//   example 6: empty('0');
//   returns 6: true

//   example 7: empty(function(){});
//   returns 7: false
J Carrillo
źródło
Dziwne ... Nie widziałem jeszcze tego rozwiązania opublikowanego w Internecie, ale użycie znaku „!” powinien zadbać o sprawdzenie większości wartości
J Carrillo
0

const isEmpty = val => val == null || !(Object.keys(val) || val).length;

ismael oliva
źródło
Nie rozumiem, użytkownik zapytał, jak sprawdzić, czy w javascript jest pusty, więc zakładam, że użytkownik zna javascript, nie ma potrzeby wyjaśniania mojej odpowiedzi, jeśli znana jest składnia?
ismael oliva
Lepsze będzie dodanie kilku słów opisu (: Może inni też chcą to zrozumieć.
RtmY
0

function isEmpty(variable) {
  const type = typeof variable
  if (variable === null) return true
  if (type === 'undefined') return true
  if (type === 'boolean') return false
  if (type === 'string') return !variable
  if (type === 'number') return false
  if (Array.isArray(variable)) return !variable.length
  if (type === 'object') return !Object.keys(variable).length
  return !variable
}

Ziarno
źródło