Wie ermittelt diese Funktion eines Objekts ist leer?

8

Ich habe den jQuery-Quellcode untersucht und festgestellt, dass sie dieses kleine Code-Snippet verwenden, um zu erkennen, ob ein JavaScript-Objekt leer ist.

%Vor%

Kann mir jemand erklären, warum das funktioniert? Ich verstehe einfach nicht, warum das jemals wieder wahr werden würde.

    
WebDevDude 28.03.2013, 20:04
quelle

6 Antworten

17

Warum es funktioniert:

Dies verwendet eine for... in -Schleife, um die Eigenschaften des Objekts zu durchlaufen.

Wenn das Objekt eine Eigenschaft besitzt, würde es in die Schleife eintreten und false

zurückgeben

Wenn das Objekt keine Eigenschaften hat, würde es die Schleife nicht betreten und true zurückgeben.

Warum nicht:

Beachten Sie, dass es einen Fall gibt, in dem es nicht funktioniert. for.. in -Schleifen durchlaufen nur enumerable -Eigenschaften, so dass ein Objekt technisch nicht leer sein kann und immer noch false zurückgibt. Man kann eine Eigenschaft definieren , um nicht aufzählbar zu sein und diese Methode auszutricksen. Hier ist der problematische Fall .

Es ist richtig zu sagen, dass diese Methode prüft, ob ein Objekt irgendwelche aufzählbaren Eigenschaften hat.

Was die Dokumente sagen:

Sie finden die Dokumentation der Methode hier .

  

Beschreibung: Überprüfen Sie, ob ein Objekt leer ist (enthält keine aufzählbaren Eigenschaften).

Ich persönlich finde es seltsam, dass sie diese Methode isEmptyObject nennen würden. Ich denke, ein besser geeigneter Name wäre hasNoEnumerableProperties .

Was ist, wenn Sie wirklich prüfen wollen, ob ein Objekt leer ist?

In neueren Implementierungen von JS kann man Object.getOwnPropertyNames verwenden . getOwnPropertyNames erhält alle Eigenschaften, aufzählbar oder nicht.

Sie können isMyObjEmpty mit Object.getOwnPropertyNames(myObject).length===0 implementieren. Dies prüft, ob das Objekt keine Eigenschaften hat, aufzählbar oder nicht.

Dies prüft jedoch keine prototypischen Eigenschaften. Dies könnte sein, oder möglicherweise kein wünschenswertes Verhalten, Sie können die Diskussion, die ich mit theshadowmonkey darüber hatte, überprüfen. Das könnte leicht gelöst werden, indem man Object.getPrototypeOf rekursiv aufruft und nach Eigenschaften in der prototypischen Kette suchen.

    
Benjamin Gruenbaum 28.03.2013, 20:06
quelle
1

Wenn es name in obj findet, dann gibt es etwas im obj und es ist nicht leer, wenn es nicht möglich ist, wird es true zurückgeben und sagen, das obj ist leer

    
Jake Zeitz 28.03.2013 20:06
quelle
0

Versuchen Sie es. Ich denke, das liegt an den Eigenschaften des Objekts. Sie müssen über hasOwnProperty verfügen, um sicherzustellen, dass Sie nicht auf seine Prototypeigenschaften zugreifen.

%Vor%

Lesen Sie das Dokument und lesen Sie die dort enthaltenen Implikationen.

Ссылка

    
theshadowmonkey 28.03.2013 20:08
quelle
0

Vielleicht nicht, aber ich nehme an, dass die Verwirrung vom Schlüssel "name" in obj kommt. Es sucht nicht wirklich nach einem Schlüssel namens name im Objekt, sondern alle Schlüssel im Objekt werden einer Variablen zugewiesen, die sie name aufgerufen haben. Wenn sie also etwas im Objekt findet, gibt sie false zurück und bestätigt, dass es sich tatsächlich nicht um ein leeres Objekt handelt. Wenn es jedoch nichts in dem Objekt findet, wird es wahr zurückgeben, was bedeutet, dass Ihr Objekt leer ist.

    
iAmClownShoe 28.03.2013 20:09
quelle
0

Der Schlüssel ist, dass die for..in-Schleife über jede Eigenschaft des Objekts iteriert, aber sonst nichts. Wenn sich überhaupt nichts in dem Objekt befindet, wird diese Schleife niemals ausgeführt, und daher wird die Zeile "return false" niemals ausgeführt. Das Programm geht dann weiter zur nächsten Zeile, die ihm sagt, dass es wahr zurückgeben soll.

(Dies führt zu einer interessanten Frage selbst. Sollte die for..in-Schleife in eine hasOwnProperty () - Prüfung eingeschlossen werden? Oder beabsichtigt die Funktion tatsächlich, nicht-eigene Eigenschaften abzufangen und das Objekt auf dieser Basis als nicht leer zu zählen ?)

    
The Spooniest 28.03.2013 21:00
quelle
-1

Wann wird es wahr zurückgegeben, wenn das Objekt natürlich leer ist.

%Vor%

Wie funktioniert es? Indem Sie for ... in

verwenden
  

für ... in

     

Zusammenfassung

     

Iteriert die aufzählbaren Eigenschaften eines Objekts willkürlich   Auftrag. Für jede einzelne Eigenschaft können Anweisungen ausgeführt werden.

Wenn also keine Eigenschaften vorhanden sind, wird es nicht in die For-In-Schleife übernommen. Die Schleife sollte wirklich nach hasOwnProperty() suchen, da dies möglich ist zu einem falsch positiven führen.

    
epascarello 28.03.2013 20:06
quelle

Tags und Links