Ich bin etwas verwirrt über JavaScript undefined
und null
Werte.
Was macht if (!testvar)
eigentlich? Testet es für undefined
und null
oder nur undefined
?
Kann ich eine einmal definierte Variable wieder undefined
löschen (daher die Variable löschen)?
Kann ich undefined
als Parameter übergeben? Z.B:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Antworten:
Sei nicht verwirrt
null
. Es ist im Allgemeinen sinnvoll und verhält sich ähnlich wie die Konzepte anderer Skriptsprachen für die Out-of-Band-Objekte 'null', 'nil' oder 'None'.undefined
Auf der anderen Seite ist eine seltsame JavaScript-Eigenart. Es ist ein Singleton-Objekt, das Out-of-Band-Werte darstellt, im Wesentlichen ein zweites ähnliches, aber unterschiedliches Objektnull
. Es kommt auf:Wenn Sie eine Funktion mit weniger Argumenten als der Argumentliste in den
function
Anweisungslisten aufrufen, werden die nicht übergebenen Argumente auf gesetztundefined
. Sie können dies testen mit z.Mit dieser Methode können Sie den Unterschied zwischen
dosomething(1)
und nicht erkennendosomething(1, undefined)
.arg2
wird in beiden der gleiche Wert sein. Wenn Sie den Unterschied erkennen müssen, können Sie sich das ansehenarguments.length
, aber solche optionalen Argumente sind im Allgemeinen nicht gut lesbar.Wenn eine Funktion no hat
return value;
, wird sie zurückgegebenundefined
. Es ist im Allgemeinen nicht erforderlich, ein solches Rückgabeergebnis zu verwenden.Wenn Sie eine Variable deklarieren, indem Sie eine
var a
Anweisung in einem Block haben, ihr jedoch noch keinen Wert zugewiesen haben, ist dies der Fallundefined
. Auch hier sollten Sie sich nie wirklich darauf verlassen müssen.Der gruselige
typeof
Operator kehrt zurück,'undefined'
wenn sein Operand eine einfache Variable ist, die nicht existiert, anstatt einen Fehler auszulösen, wie es normalerweise der Fall wäre, wenn Sie versuchen würden, darauf zu verweisen. (Sie können ihm auch eine einfache Variable in Klammern geben, aber keinen vollständigen Ausdruck mit einer nicht vorhandenen Variablen.) Auch dafür ist es nicht sehr nützlich.Dies ist der umstrittene. Wenn Sie auf eine Eigenschaft eines Objekts zugreifen, die nicht vorhanden ist, wird nicht wie in jeder anderen Sprache sofort ein Fehler angezeigt. Stattdessen erhalten Sie ein
undefined
Objekt. (Und wenn Sie dann versuchen, diesesundefined
Objekt später im Skript zu verwenden, wird es auf eine seltsame Weise schief gehen, die viel schwieriger zu finden ist, als wenn JavaScript gerade sofort einen Fehler ausgelöst hätte.)Dies wird häufig verwendet, um das Vorhandensein von Eigenschaften zu überprüfen:
Da Sie jedoch
undefined
wie jeden anderen Wert zuweisen können:das erkennt eigentlich nicht, ob die Immobilie dort zuverlässig ist. Verwenden Sie besser den
in
Operator, der nicht in der ursprünglichen Netscape-Version von JavaScript enthalten war, jetzt aber überall verfügbar ist:Zusammenfassend
undefined
ist ein JavaScript-spezifisches Durcheinander, das alle verwirrt. Abgesehen von optionalen Funktionsargumenten, bei denen JS keinen anderen eleganteren Mechanismus hat,undefined
sollten diese vermieden werden. Es hätte niemals Teil der Sprache sein dürfen;null
hätte für (2) und (3) gut funktioniert, und (4) ist eine Fehlfunktion, die nur existiert, weil JavaScript am Anfang keine Ausnahmen hatte.Eine solche ‚Truthiness‘ Test prüft , gegen
false
,undefined
,null
,0
,NaN
und leere Strings. Aber in diesem Fall geht es wirklichundefined
darum. IMO, es sollte expliziter sein und sagenif (testvar!==undefined)
.Sie können es sicherlich zuweisen
undefined
, aber das wird die Variable nicht löschen. Nur derdelete object.property
Bediener entfernt wirklich Dinge.delete
ist eigentlich eher für Eigenschaften als für Variablen als solche gedacht. Mit Browsern können Sie direkt davonkommendelete variable
, aber es ist keine gute Idee und funktioniert nicht im strengen Modus von ECMAScript Fifth Edition. Wenn Sie einen Verweis auf etwas freigeben möchten, damit es durch Müll gesammelt werden kann, ist es üblicher zu sagenvariable= null
.Ja.
quelle
undefined
ist ein Singleton-Objekt? Was meinst du? Es ist ein primitiver Wert und kein Objekt.typeof foo=='undefined'
; Es wird in der Regel für (4a) globales Schnüffeln verwendet. In diesem Fall würde ich es vorziehen, explizit zu sein und zu sagen'foo' in window
, oder (4b) gegen denundefined
Wert selbst zu testen. In diesem Fall würde ich es vorziehen, lesbar zu sein und zu sagenfoo===undefined
. Theoretisch könnte das Testentypeof
gegen'undefined'
einen Anwendungsfall haben, den andere Konstrukte nicht bieten könnten: das Schnüffeln auf die Existenz lokaler Variablen. In Wirklichkeit wissen Sie jedoch so ziemlich immer, welche Variablen als lokal deklariert sind.return
Anweisungundefined
, wird zurückgegeben. Wenn die Funktion jedoch ein Konstruktor ist (der vomnew
Operator aufgerufen wird ), wird das neue Objekt (der Wertthis
innerhalb des Konstruktors) zurückgegeben, obwohl keinereturn
Anweisung vorhanden ist.console.log((function (){}()));
kehrt zurückundefined
.console.log((new function (){}()));
gibt ein Objekt zurück.Sie können (sollten nicht?) Nichts als undefiniert definieren, da die Variable nicht mehr undefiniert wäre - Sie haben sie nur für etwas definiert .
Sie können (sollten nicht?) Nicht
undefined
an eine Funktion übergeben. Wenn Sie einen leeren Wert übergeben möchten, verwenden Sienull
stattdessen.Die Anweisung
if(!testvar)
prüft auf boolesche True / False-Werte. In dieser Anweisung wird geprüft, ob einetestvar
Bewertung vorliegtfalse
. Per Definitionnull
undundefined
sollte weder als ausgewertettrue
oderfalse
aber JavaScript auswertetnull
wiefalse
und gibt einen Fehler , wenn Sie versuchen , eine nicht definierte Variable zu bewerten.Verwenden Sie diese, um ordnungsgemäß auf
undefined
oder zu testennull
:quelle
==
und!=
) ab.var a= undefined
. Sie können passierenfn(undefined)
. Wenn Sie den Unterschied zwischen einer undefinierten Eigenschaftp
eines Objektso
und einer Eigenschaftp
, die definiert und festgelegt wurdeundefined
, ermitteln möchten , müssen Sie den'p' in o
Operator verwenden.testvar === undefined
eher auf die komplizierteren testen solltetypeof(testvar) === "undefined"
?typeof
Test für nicht definierte Variablen: Im Gegensatz zunull
,undefined
ist einfach eine Eigenschaft des globalen Objekts und selbst neu definiert werden kann. Es braucht nur einen bestimmten Codierungsstil und ein fehlendes Gleichheitszeichen undundefined
wird stillschweigend geändert:if (undefined = someVar) {...}
undefined
eine unveränderliche Eigenschaft des globalen Objekts erstellt wird, sodass es sicherer ist als früher. Es ist jedoch weiterhin möglich, eine veränderbare Variable zu definieren, dieundefined
innerhalb einer Funktion aufgerufen wird , sodass das Problem nicht vollständig behoben ist.Der grundlegende Unterschied ist , dass
undefined
undnull
unterschiedliche Konzepte darstellen.Wenn nur
null
verfügbar wäre, könnten Sie nicht feststellen, obnull
absichtlich als Wert festgelegt wurde oder ob der Wert noch nicht festgelegt wurde, es sei denn, Sie haben eine umständliche Fehlererkennung verwendet: zWenn Sie den Wert jedoch absichtlich auf festlegen
null
,undefined
schlägt die strikte Gleichheit mit fehl, wodurch Sie zwischennull
undundefined
Werten unterscheiden können:Schauen Sie sich die Referenz hier an, anstatt sich darauf zu verlassen, dass Leute abweisend Junk sagen wie "Zusammenfassend ist undefiniert ein JavaScript-spezifisches Durcheinander, das alle verwirrt". Nur weil Sie verwirrt sind, heißt das nicht, dass es ein Chaos ist.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Dieses Verhalten ist auch nicht spezifisch für JavaScript und es vervollständigt das verallgemeinerte Konzept , dass ein logisches Ergebnis sein kann
true
,false
unbekannt (null
), keinen Wert (undefined
) oder etwas schief gelaufen ist (error
).http://en.wikipedia.org/wiki/Undefined_value
quelle
null
hätte trotzdem gut funktioniert.a == null
liegttrue
daran, dass Javascript Typ Zwang.Der beste Weg, um nach Nullwerten zu suchen, ist
und für undefiniert
Sie können eine Avariable mit undefined zuweisen.
quelle
!==
, nicht!=
Ja, Sie können, weil nicht definiert ist definiert als nicht definiert.
dein Fall:
Sie können auch Ihre eigene undefinierte Variable erstellen :
quelle
Um Ihre erste Frage zu beantworten, zwingt der Operator not (
!
) alles, was ihm gegeben wird, in einen booleschen Wert. Alsonull
,0
,false
,NaN
und""
(leere Zeichenkette) werden alle falsch erscheinen.quelle
undefined
wird nicht als angezeigtfalse
, es wird ein Fehler "ist nicht definiert" ausgegeben.if (undefined) {/* Do stuff*/}
gibt keinen Fehler aus, da erundefined
als Eigenschaft des globalen Objekts existiert. Was einen Fehler gibt, ist so etwas wieif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, wie man eine Variable in der Kommandozeile auf undefiniert setzt:
Setzen Sie eine Variable im
js
JavaScript-Befehlszeilenterminal, das mit Java unter Ubuntu 12.10 geliefert wird, auf undefiniert .Wenn Sie eine Variable in einem Javascript auf undefiniert setzen:
Fügen Sie dies in myjs.html ein:
Es druckt dies:
WARNUNG! Wenn Sie Ihre Variable auf undefiniert setzen, setzen Sie Ihre Variable auf eine andere Variable. Wenn eine hinterhältige Person ausgeführt
undefined = 'rm -rf /';
wird, erhalten Sie diesen Wert, wenn Sie Ihre Variable auf undefiniert setzen.Sie fragen sich vielleicht, wie ich die Aliens mit undefiniertem Wert zu Beginn ausgeben und sie noch ausführen lassen kann. Es liegt am Heben von Javascript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
quelle
Versuche dies:
quelle
Das for
if (something)
undif (!something)
wird häufig verwendet, um zu überprüfen, ob etwas definiert ist oder nicht. Zum Beispiel:Der Bezeichner wird in einen booleschen Wert konvertiert und als
undefined
interpretiertfalse
. Es gibt natürlich auch andere Werte (wie 0 und ''), die ebenfalls als interpretiert werdenfalse
, aber entweder sollte der Bezeichner keinen solchen Wert haben, oder Sie sind zufrieden damit, einen solchen Wert als undefiniert zu behandeln.Javascript verfügt über einen
delete
Operator, mit dem ein Mitglied eines Objekts gelöscht werden kann. Abhängig vom Umfang einer Variablen (dh ob sie global ist oder nicht) können Sie sie löschen, um sie undefiniert zu machen.Es gibt kein
undefined
Schlüsselwort, das Sie als undefiniertes Literal verwenden können. Sie können Parameter in einem Funktionsaufruf weglassen, um sie undefiniert zu machen. Dies kann jedoch nur verwendet werden, indem weniger Parameter an die Funktion gesendet werden. Sie können keinen Parameter in der Mitte weglassen.quelle
Nur zum Spaß, hier ist eine ziemlich sichere Möglichkeit, einer Variablen "nicht zugewiesen" zuzuweisen. Damit dies zu einer Kollision kommt, muss jemand dem Prototyp für Object mit genau demselben Namen wie die zufällig generierte Zeichenfolge hinzugefügt haben. Ich bin sicher, dass der Zufallszeichenfolgengenerator verbessert werden könnte, aber ich habe nur eine Frage beantwortet: Generieren Sie zufällige Zeichenfolgen / Zeichen in JavaScript
Dies funktioniert, indem ein neues Objekt erstellt und versucht wird, auf eine Eigenschaft mit einem zufällig generierten Namen zuzugreifen, von dem wir annehmen, dass er nicht existiert und daher den Wert undefiniert hat.
quelle