Ich bin ein bisschen verwirrt über Javascript undefined & null.
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 Objekt null
. Es kommt auf:
Wenn Sie eine Funktion mit weniger Argumenten als der Argumentliste in den function
Anweisungslisten aufrufen, werden die nicht übergebenen Argumente auf gesetzt undefined
. Sie können dies testen mit z.
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Mit dieser Methode können Sie den Unterschied zwischen dosomething(1)
und nicht erkennen dosomething(1, undefined)
. arg2
wird in beiden der gleiche Wert sein. Wenn Sie den Unterschied erkennen müssen, können Sie sich das ansehen arguments.length
, aber solche optionalen Argumente sind im Allgemeinen nicht gut lesbar.
Wenn eine Funktion no hat return value;
, wird sie zurückgegeben undefined
. 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 Fall undefined
. 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, dieses undefined
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:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Da Sie jedoch undefined
wie jeden anderen Wert zuweisen können:
o.prop= undefined;
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:
if ('prop' in o)
...
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.
was macht if (!testvar)
eigentlich Testet es auf undefiniert und null oder nur undefiniert?
Eine solche ‚Truthiness‘ Test prüft , gegen false
, undefined
, null
, 0
, NaN
und leere Strings. Aber in diesem Fall geht es wirklich undefined
darum. IMO, es sollte expliziter sein und sagen if (testvar!==undefined)
.
Sobald eine Variable definiert ist, kann ich sie wieder auf undefiniert löschen (daher die Variable löschen).
Sie können es sicherlich zuweisen undefined
, aber das wird die Variable nicht löschen. Nur der delete 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 davonkommen delete 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 sagen variable= null
.
Kann ich undefined als Parameter übergeben?
Ja.