2017-12-18 9 views
0

Ich fand diesen Unterschied zwischen undefined und "undefined" und ich versuche es zu verstehen.Vergleich mit undefined oder "undefined" beim Prüfen auf Objekteigenschaften. Was ist der Unterschied?

Ich habe geprüft, ob Eigenschaften in Objekten definiert sind oder nicht. Im ersten Beispiel habe ich überprüft, ob die Eigenschaft nicht definiert ist. Alle folgenden Tests werden als wahr ausgewertet. Es spielt keine Rolle, ob ich "undefined" oder undefined verwende.

var test = { 
 
    x: 1, 
 
    y: 2 
 
}; 
 

 
if (test.x != "undefined") console.log('test.x != "undefined"'); //TRUE 
 
if (test.x !== "undefined") console.log('test.x !== "undefined"'); //TRUE 
 
if (test.x != undefined) console.log('test.x != undefined'); //TRUE 
 
if (test.x !== undefined) console.log('test.x !== undefined'); //TRUE

Dann versuchte ich es mit Eigenschaft, die nicht auf true defined.It wird nur ausgewertet, wenn ich undefined (nicht Stringliteral) verwenden oder mit typeof.

var test = { 
 
    x: 1, 
 
    y: 2 
 
}; 
 

 
if (test.z === undefined) console.log("test.z === undefined"); //TRUE 
 
if (test.z == undefined) console.log("test.z == undefined"); //TRUE 
 
if (test.z === "undefined") console.log("test.z === 'undefined'"); //FALSE 
 
if (test.z == "undefined") console.log("test.z == 'undefined'"); //FALSE 
 
if (typeof test.z === "undefined") console.log("typeof test.z === 'undefined'"); //TRUE

Also meine Frage ist: warum der Unterschied (Ich glaube, ich etwas nicht verstehe ...). Ist es eine schlechte Übung, dass ich einen Vergleich mit "undefiniert"/undefiniert statt .hasOwnProperty() verwendet habe?

+0

Es hängt davon ab, was Sie überprüfen möchten. In den meisten Fällen können Sie einfach Folgendes verwenden: 'if (test.x) {...}' oder 'if (! Text.z) {...}'. Diese Art von Bedingungen überprüfen viele Dinge wie 'undefined', * leere Zeichenfolge *,' 0', 'null',' false'. – Titus

+0

@Titus: Ich möchte nur überprüfen, ob es existiert; Die nächste Stufe ist switch() abhängig von der Eigenschaft. –

+1

In diesem Fall können Sie die Anweisung 'switch' direkt schreiben, es ist keine Prüfung erforderlich. – Titus

Antwort

1

undefined und "undefined" sind unterschiedliche Werte. Ersteres ist undefined, letzteres ist eine Zeichenfolge.

Was Sie wahrscheinlich gesehen haben, ist nicht x === "undefined" und x === undefined, sondern typeof x === "undefined" und x === undefined. Beachten Sie die typeof. Einer der Gründe, warum Sie den ersten (mit typeof) sehen, ist historisch und nicht mehr relevant, aber nicht alle Gründe sind. x und dass undefined ist nicht beschatteten, diese beiden Aussagen effektiv gleich sind andere als der erste, der ein teensy bisschen mehr Arbeit zu tun hat

einen deklarierten Bezeichner Unter der Annahme:

typeof x === "undefined" 
x === undefined 

Aber wenn xist nicht deklariert, die erstere wird wahr, und die letztere wird mit einem ReferenceError fehlschlagen. (Im allgemeinen Fall, werden Sie wahrscheinlich wollen die Reference, wie es Ihnen auf die nicht angemeldete idenfier alarmiert, aber es gibt Anwendungsfälle für die ersteren.)

Aber undefined ist leider kein Schlüsselwort (wie null); es ist eine globale Konstante.Das bedeutet, dass undefined kann beschattet:

function foo(undefined) { 
 
    var x; // x defaults to the value undefined 
 
    console.log(typeof x === "undefined"); // true 
 
    console.log(x === undefined);   // false?!?! 
 
} 
 
foo(42);

In der Praxis, wenn Sie jemanden, der ihnen einen Wert undefined und geben andere als undefined, nehmen Sie zurück und schlugen sie über die finden Shadowing Kopf und Schultern mit einer nassen Nudel, bis sie Sinn erkennen. Aber ...

Historisch gab es vor vielen Jahren ein Problem mit dem undefined Wert in einem Fenster, das nicht === zum Wert ist. Und wenn Sie Code hatten, der sich mit Werten aus verschiedenen Fenstern befassen konnte, war der Vergleich mit === undefined kein zuverlässiger Weg, nach undefined zu suchen. Vor ein paar Jahren habe ich alle vage Browser-Browser überprüft und das war kein Problem (ich vermute, dass es nicht mehr lange her ist).

1

Wenn Sie nach "undefined" (in Anführungszeichen) suchen, dann suchen Sie nach Zeichenfolge mit Wert "undefined".

Wenn Sie dagegen nach undefined suchen, wird geprüft, ob die Eigenschaft oder die Variable definiert ist oder nicht. Daher können Sie damit prüfen, ob die Eigenschaft definiert ist.

Verwandte Themen