Jedes Mal , wenn jemand erwähnt die Prüfung gegen undefined
, es ist darauf hingewiesen , dass undefined
kein Schlüsselwort ist , so kann es eingestellt werden"hello"
, so dass Sie verwenden sollen typeof x == "undefined"
, statt. Das kommt mir lächerlich vor. Niemand würde das jemals tun, und wenn sie es tun würden, wäre es Grund genug, niemals einen Code zu verwenden, den sie geschrieben haben ... richtig?
Ich fand ein Beispiel von jemandem, der aus Versehen gesetzt undefined
zu null
, und dies wurde als Grund gegeben zu vermeiden , unter der Annahme , dass undefined
nicht überschrieben wird. Aber wenn sie das getan hätten, wäre der Fehler unentdeckt geblieben, und ich sehe nicht, wie das besser ist.
In C ++ ist sich jeder bewusst, dass es legal ist zu sagen #define true false
, aber niemand rät Ihnen jemals, es zu vermeiden true
und 0 == 0
stattdessen zu verwenden. Sie gehen einfach davon aus, dass niemand jemals groß genug sein würde, um das zu tun, und wenn doch, vertrauen Sie ihrem Code nie wieder.
Hat dies jemals jemanden gebissen, dem jemand anderes undefined
(absichtlich) zugewiesen wurde, und es hat Ihren Code gebrochen, oder ist dies eher eine hypothetische Bedrohung? Ich bin bereit, mein Risiko einzugehen, um meinen Code geringfügig lesbarer zu machen. Ist das eine wirklich schlechte Idee?
Um es noch einmal zu wiederholen, ich frage nicht , wie ich mich vor neu zugewiesenen undefinierten schützen soll. Ich habe diese Tricks schon 100 Mal geschrieben. Ich frage, wie gefährlich es ist, diese Tricks nicht anzuwenden.
quelle
undefined
, sollten Sie mehr über jemanden Neudefinition kümmernXMLHttpRequest
, oderalert
. Alle Funktionen, die wir verwenden,window
könnten neu definiert worden sein. Und wenn Sie sich nur Sorgen machen, dass ein Mitarbeiter dies versehentlich tut, warum sollten Sie ihm dann vertrauen, dass er es nicht tutwindow.addEventListener = "coolbeans"
? Die Antwort ist, sich darüber keine Sorgen zu machen. Wenn jemand böswillig JS in Ihre Seite injiziert, werden Sie trotzdem abgespritzt. Die Arbeiten an verhindern , dass aus geschieht in erster Linie.Antworten:
Nein, das habe ich nie. Dies liegt hauptsächlich daran, dass ich auf modernen Browsern entwickle, die größtenteils ECMAScript 5-kompatibel sind. Der ES5-Standard schreibt vor, dass dies
undefined
jetzt nur noch lesbar ist. Wenn Sie den strengen Modus verwenden (sollten Sie), wird ein Fehler ausgegeben, wenn Sie versehentlich versuchen, ihn zu ändern.Was Sie nicht tun sollten , ist Ihr eigenes Ziel zu erstellen, veränderlich
undefined
:Konstante ist in Ordnung. Immer noch unnötig, aber in Ordnung.
quelle
Kein richtiger Code kann so etwas tun. Aber Sie können nie wissen, was ein Möchtegern-Smart-Entwickler oder ein Plugin / eine Bibliothek / ein Skript, das Sie verwenden, getan hat. Auf der anderen Seite ist dies äußerst unwahrscheinlich und moderne Browser erlauben
undefined
überhaupt kein Überschreiben. Wenn Sie also einen solchen Browser für die Entwicklung verwenden, werden Sie schnell feststellen, ob Code versucht, ihn zu überschreiben.Und obwohl Sie nicht danach gefragt haben - viele Leute werden diese Frage wahrscheinlich finden, wenn sie nach dem allgemeineren
undefined
Problem suchen, wie man sich vor einer Neudefinition schützt. Deshalb werde ich das trotzdem beantworten:Es gibt einen sehr guten Weg, um eine wirklich undefinierte zu erhalten,
undefined
egal wie alt der Browser ist:Dies funktioniert, weil immer ein Argument angegeben wird, das nicht angegeben ist
undefined
. Sie können dies auch mit einer Funktion tun, die einige echte Argumente akzeptiert, z. B. wenn Sie jQuery verwenden. Es ist normalerweise eine gute Idee, auf diese Weise eine gesunde Umgebung zu gewährleisten:Dann können Sie sicher sein, dass innerhalb dieser anonymen Funktion die folgenden Dinge zutreffen:
$ === jQuery
window === [the global object]
undefined === [undefined]
.Beachten Sie jedoch, dass manchmal
typeof x === 'undefined'
tatsächlich erforderlich ist : Wenn die Variablex
nie auf einen Wert gesetzt (entgegen zu sein gewesen Satz zuundefined
), das Lesenx
in einer anderen Art und Weise, wieif(x === undefined)
einen Fehler werfen. Dies gilt jedoch nicht für Objekteigenschaften. Wenn Sie also wissen, dassy
es sich immer um ein Objekt handelt,if(y.x === undefined)
ist dies absolut sicher.quelle
x
kein Wert festgelegt wurde, ist nicht ganz richtig (siehe jsfiddle.net/MgADz ). Es ist eher so, als ob es wirklich nicht definiert ist (siehe jsfiddle.net/MgADz/1 ).undefined = someVariable
dass dies ein Fehler ist und Sie möchten , dass die Dinge kaputt gehen. Zumindest tue ich das.undefined
, dass er ist, und weisen Sie ihnundefined
im Umfang zu. Lassenundefined
Sie das Schreiben nicht offen, wenn Sie "zu viele" Argumente eingeben. Das führt zu Fehlern und ist von Natur aus nicht defensiv, insbesondere wenn es, wie Lucero betont , sehr einfache Alternativen gibt, um solideundefined
Werte in den Geltungsbereich zu bringen.Dafür gibt es eine einfache Lösung: Vergleichen, gegen
void 0
die immer undefiniert ist.Beachten Sie, dass Sie dies vermeiden sollten,
==
da dies die Werte erzwingen kann. Verwenden Sie stattdessen===
(und!==
).Das heißt, die undefinierte Variable kann irrtümlich gesetzt werden, wenn jemand schreibt,
=
anstatt==
etwas mit etwas zu vergleichenundefined
.quelle
foo === void 0
möglicherweise nicht sofoo === undefined
flüssigundefined
ist und dass unveränderliche Daten von modernen Browsern (IE 9+) vollständig unterstützt werden, wie Sie in dieser Kompatibilitätstabelle sehen können.Nur Sie wissen, welchen Code Sie verwenden und wie gefährlich er ist. Diese Frage kann nicht so beantwortet werden, wie Sie es geklärt haben.
1) Erstellen Sie eine Teamrichtlinie, lassen Sie die Neudefinition von undefiniert nicht zu und reservieren Sie sie für die häufigere Verwendung. Scannen Sie Ihren vorhandenen Code nach undefinierter linker Zuordnung.
2) Wenn Sie nicht alle Szenarien kontrollieren, wenn Ihr Code außerhalb von Situationen verwendet wird, die Sie oder Ihre Richtlinien kontrollieren, ist Ihre Antwort offensichtlich anders. Scannen Sie den Code, der Ihre Skripte verwendet. Wenn Sie möchten, durchsuchen Sie das Web nach Statistiken über undefinierte Linkszuweisungen, aber ich bezweifle, dass dies für Sie getan wurde, da es einfacher ist, stattdessen nur Antwort 1 oder 3 hier zu verfolgen.
3) Und wenn diese Antwort nicht gut genug ist, liegt es wahrscheinlich daran, dass Sie wiederum eine andere Antwort benötigen. Möglicherweise schreiben Sie eine beliebte Bibliothek, die in Unternehmensfirewalls verwendet wird, und Sie haben keinen Zugriff auf den aufrufenden Code. Verwenden Sie dann eine der anderen guten Antworten hier. Beachten Sie, dass die beliebte jQuery-Bibliothek die Soundkapselung praktiziert und beginnt:
Nur Sie können Ihre Frage auf die von Ihnen gewünschte Weise beantworten. Was gibt es noch zu sagen?
edit: ps wenn du wirklich meine meinung willst, sage ich dir, dass es überhaupt nicht gefährlich ist. Alles, was so wahrscheinlich zu Fehlern führen würde (z. B. die Zuordnung zu undefiniert, was offensichtlich ein gut dokumentiertes Risikoverhalten ist), ist selbst ein Fehler. Es ist der Defekt, der das Risiko darstellt. Aber das ist nur in meinen Szenarien, in denen ich es mir leisten kann, diese Perspektive beizubehalten. Wie ich Ihnen empfehlen würde, habe ich die Frage für meine Anwendungsfälle beantwortet.
quelle
Es ist sicher, gegen undefinierte zu testen. Wie Sie bereits erwähnen. Wenn Sie zu einem Code gelangen, der ihn überschreibt (was sehr verbesserungsfähig ist), verwenden Sie ihn einfach nicht mehr.
Wenn Sie eine Bibliothek für den öffentlichen Gebrauch erstellen, können Sie möglicherweise einige der Techniken verwenden, um zu vermeiden, dass der Benutzer sie ändert. Aber selbst in diesem Fall ist es ihr Problem, nicht Ihre Bibliothek.
quelle
Sie können
undefined
in Ihrem Code Codierungen für Browser verwenden, die ECMAScript 5.1 unterstützen, da diese gemäß der Sprachspezifikation unveränderlich sind .Siehe auch diese Kompatibilitätstabelle oder diese caniuse ECMAScript 5 zu sehen , dass alle modernen Browser (IE 9+) unveränderlich umgesetzt haben
undefined
.quelle
Es ist überhaupt nicht gefährlich. Es kann nur überschrieben werden, wenn es mit einem ES3-Motor betrieben wird, und das wird wahrscheinlich nicht mehr verwendet.
quelle
Erstens, wenn Ihr Code kaputt geht, liegt das wahrscheinlich nicht daran, dass ein anderer Entwickler da draußen "versucht, ein Idiot zu sein", wie Sie es ausdrücken.
Es ist wahr, dass dies
undefined
kein Schlüsselwort ist. Aber es ist ein Primitiv auf globaler Ebene. Es sollte so verwendet werden (siehe "undefiniert" unter developer.mozilla.org ):Die übliche Alternative dazu (auch von MDN ) und meiner Meinung nach der bessere Weg ist:
Was einige Vorteile hat, ist der offensichtliche (aus den Kommentaren), dass es keine Ausnahme auslöst, wenn x nicht deklariert ist. Es ist auch erwähnenswert, dass MDN weist darauf hin, dass es wichtig ist , zu verwenden ,
===
über==
im ersten Fall , weil:Dies ist ein weiterer oft übersehener Grund, warum es wahrscheinlich in allen Fällen besser ist, nur die zweite Alternative zu verwenden.
Fazit: Es ist nicht falsch, es auf die erste Weise zu codieren, und schon gar nicht gefährlich. Das Argument, das Sie als Beispiel dafür gesehen haben (das überschrieben werden kann), ist nicht das stärkste Argument für die Codierung der Alternative mit
typeof
. Die Verwendungtypeof
ist jedoch aus einem bestimmten Grund stärker: Sie löst keine Ausnahme aus, wenn Ihre Variable nicht deklariert ist. Es könnte auch argumentiert werden, dass die Verwendung von==
anstelle von===
ein häufiger Fehler ist. In diesem Fall wird nicht das getan, was Sie erwartet haben. Warum also nicht verwendentypeof
?quelle