2016-01-05 7 views
5

Ich muss erwähnen: Ich kenne ein bisschen JavaScript, aber ich bin nicht sehr tief darin.Eigenschaftserkennung: Verwenden von 'in' versus Zugriff auf Eigenschaft versuchen

Immer die richtige Art und Weise betrachtet zu überprüfen, ob eine Eigenschaft auf ein Objekt verfügbar:

if (window.console) { 
    // doSomething 
} 

Gestern habe ich Code gesehen habe, in dem diese Technik verwendet wurde:

if ('console' in window) { 
    // doSomething 
} 

Sind beide Techniken gleichwertig? Oder unterscheiden sie?

+1

Versuchen Sie, eine 'window.console = false;' auszuführen, und führen Sie dann beide Konstrukte aus. Sehen Sie, was passiert - https://jsfiddle.net/abhitalks/xmohL5wr/ – Abhitalks

Antwort

4

Nein. Sie haben einen Unterschied.

Zuerst eine überprüft, ob der Wert von window.console truthy ist und die zweite Überprüfung der console Eigenschaft existiert in window.

Angenommen, Sie haben eine Variable wie folgt erstellen.

window.myName = ""; 

Nun if (window.MyName) wird scheitern die Bedingung zu erfüllen, als leere Strings Falsy in JavaScript sind.

console.log(Boolean(window.myName)); // false 

Aber if ("myName" in window) wird die Bedingung erfüllen, als myName eine Eigenschaft von window Objekt ist.

console.log(Boolean("myName" in window)); // true 

Hinweis:in wird von einem Operator true selbst zurück, wenn die Eigenschaft getestet wird in der Prototyp-Hierarchie ist irgendwo. Zum Beispiel

console.log("toString" in {}); // true 

Es gibt true, weil das Objekt {} die Methode toString erbt.

Wenn Sie sicherstellen möchten, dass das Eigentum an dem Objekt selbst existiert, dann sollten Sie Object.prototype.hasOwnProperty verwenden, wie diese

console.log({}.hasOwnProperty("toString")); // false 
+1

Okay. Im Falle des ersten: Wenn die Konsole nicht existiert, gibt sie undefined == falsy value zurück. Es tritt also nicht in den if-Block ein. Dann wäre die Verwendung von "in" sauberer? – bo256

+0

@ bo256 Wenn Sie wirklich prüfen möchten, ob eine Eigenschaft existiert oder nicht, sollten Sie den Operator 'in' verwenden. – thefourtheye

4

Nein, sie einen Unterschied haben.

Wenn Sie den Operator in verwenden, prüfen Sie, ob die Eigenschaft im angegebenen Objekt angegeben ist und nicht der Wert. Zum Beispiel:

var obj = { foo: undefined } 
obj.foo !== undefined; // false 
'foo' in obj;   // true 

hoffen, es hilft

1

In Ihrem Fall gleichwertig es ist. Wenn Sie in Operator verwenden, sieht es aus, dass Eigenschaft in Objekt vorhanden ist. Und wenn Sie if (window.console) verwenden, sieht es aus, dass window.console ein Wahrheitswert ist.

1

Wenn Sie sagen window.console wird es für die Eigenschaft console in window Objekt überprüfen.Ich denke nicht, Wetter console Eigenschaft ist eigene Eigenschaft von Fensterobjekt oder es wird von Eltern geerbt.

Auf der anderen Seite in console in window wird die in sicher Eigenschaft machen ist als Eigentum von Window-Objekt vorhanden ist und nicht von den Eltern geerbt.

+0

Siehe @thefourtheye Antwort –

Verwandte Themen