2010-09-01 13 views
7

I JavaScript-Code oft sehen, wo eine Funktion in einem „Optionen“ Objekt in Anspruch nehmen und verwenden Sie es mögen:JavaScript undefined Check

var name = typeof options.name !== 'undefined' ? options.name : "Bob"; 

Dies scheint, wie es auf den folgenden entsprechen würde:

var name = options.name || "Bob"; 

Jetzt verstehe ich, dass Sie in bestimmten Situationen tatsächlich kümmern, dass options.name ist undefined vs null und das macht Sinn für mich, aber ich sehe das oft in Situationen, in denen diese Unterscheidung nicht notwendig ist.

Ich glaube, ich habe gehört, dass Leute Code wie dieser wegen eines Fehlers im IE schreiben. Kann jemand bitte etwas ausarbeiten?

Antwort

6

Ich bin nicht bekannt, die Fehler im IE, aber diese Aussagen sind nicht genau äquivalent:

  • Die erste setzt die name Variable auf den Standard "Bob" nur, wenn options.nameundefined ist.

  • Die zweite setzt die name Variable auf "Bob" wann immer options.name ist falsch. Dies kann eine leere Zeichenfolge sein, der null Wert, ein Wert von 0, der NaN Wert, der boolesche Wert false, und auch undefined.

Zum Beispiel, wenn options.name === 0 wird gesetzt die erste Anweisung des name Variable 0, während die zweite Aussage, die es zu "Bob" gesetzt wird.

2

Ich hoffe, es hängt davon ab, was der Entwickler eigentlich tun will, und nicht für welche Konvention sie auch immer einwilligen. In vielen Fällen könnte der kürzere name = options.name || "Bob"; Ihnen am Ende Werte geben, die Sie nicht erwarten, wenn Sie sich seines tatsächlichen Verhaltens nicht bewusst sind, weil er einen booleschen Wert aus options.name erzwingt. In anderen Fällen sind andere "Falsy" -Werte unmöglich (oder fast unmöglich): Wenn der Wert zum Beispiel aus einem Formularelement herauskommt, müssen Sie sich nicht wirklich um undefined, null, false oder 0 kümmern sollte immer eine Zeichenkette sein, solange das Formularelement existiert - also, was diese Überprüfung tun würde, ist sicherzustellen, dass das Feld keine leere Zeichenkette ist (obwohl irgendein weißer Raum durchkommen würde). Ein anderes übliches Muster ähnlich options.name || "Bob" ist if (options.name) {...}, das die gleichen potentiellen Probleme/Vorteile hat.

Verwandte Themen