3893 Stimmen

Wie kann ich auf ein leeres JavaScript-Objekt testen?

Nach einer AJAX-Anfrage kann es vorkommen, dass meine Anwendung ein leeres Objekt zurückgibt, z. B.:

var a = {};

Wie kann ich überprüfen, ob das der Fall ist?

135voto

es cologne Punkte 2658
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

siehe http://bencollier.net/2011/04/javascript-is-an-object-empty/

7 Stimmen

Dazu gehören auch nicht aufzählbare Eigenschaften, falls es Sie interessiert.

0 Stimmen

Die Option Object.getOwnPropertyNames({}).length ist 10 mal langsamer als die Option (for...in...) - ich schlage vor, sie als Möglichkeit zu vermeiden, um zu testen, ob ein Objekt leer ist.

5 Stimmen

Object.getOwnPropertyNames(new Date()).length === 0 Diese Antwort kann also irreführend sein.

106voto

Ateszki Punkte 2097

Wie wäre es mit der Verwendung von JSON.stringify? Es ist in fast allen modernen Browsern verfügbar.

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

38 Stimmen

Das ist langsam, und bei dieser Art von Dienstprogramm kommt es auf Geschwindigkeit an. Schneller Leistungstest hier: jsperf.com/leeres-objekt-test

2 Stimmen

Dies ist eine sehr langsame Option - ich schlage vor, stattdessen die Option (for...in) zu verwenden

4 Stimmen

Und es funktioniert nicht für Objekte, die Funktionen enthalten.

87voto

download Punkte 1418

Es gibt eine einfache Möglichkeit, wenn Sie einen neueren Browser verwenden. Object.keys(obj).length == 0

1 Stimmen

Wo ist die keys Woher kommt das Eigentum?

4 Stimmen

Es ist ein Standardmethode in ECMAScript 5.1

1 Stimmen

Wie kann der obige Kommentar 4 Upvotes haben? Ja, Object.keys ist eine Standardmethode, aber Objekte haben keine Schlüsseleigenschaft. Daher wird dieser Code jedes Objekt als leer melden, es sei denn, es hat zufällig eine Eigenschaft namens key mit einem Wert, der wiederum als eine Eigenschaft namens length die nicht Null ist. Schrecklich!

64voto

Alte Frage, aber ich hatte gerade das Problem. Einschließlich JQuery ist nicht wirklich eine gute Idee, wenn Ihr einziger Zweck ist zu überprüfen, ob das Objekt nicht leer ist. Stattdessen, nur tief in Der Code von JQuery und Sie werden die Antwort erhalten:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

5 Stimmen

Dies ist nur sinnvoll, wenn ein anderer Prozess keinen Prototyp zu Ihrem Basisobjekt hinzugefügt hat. Damit dies wirklich funktioniert, müssen Sie auf obj.hasOwnProperty(name) testen

50voto

davidhadas Punkte 2233

Die Verwendung von Object.keys(obj).length (wie oben für ECMA 5+ vorgeschlagen) ist bei leeren Objekten 10 mal langsamer! Bleiben Sie bei der "old school" (for...in) Option.

Getestet unter Node, Chrome, Firefox und IE 9, wird deutlich, dass für die meisten Anwendungsfälle:

  • (für...in...) ist die schnellste Option, die Sie verwenden können!
  • Object.keys(obj).length ist bei leeren Objekten 10 Mal langsamer
  • JSON.stringify(obj).length ist immer am langsamsten (nicht überraschend)
  • Object.getOwnPropertyNames(obj).length dauert länger als Object.keys(obj).length kann auf manchen Systemen viel länger sein.

Unterm Strich ist die Leistung zu nutzen:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

oder

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

Detaillierte Testergebnisse und Testcode finden Sie unter Ist das Objekt leer?

1 Stimmen

Object.keys ist langsam, hat aber weniger Code. Auf einer kleinen Seite, auf der dies vielleicht 10 Mal aufgerufen wird... Wird dies immer noch langsamer sein, wenn man die zusätzliche Parsing-Zeit des zusätzlichen Codes berücksichtigt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X