Ich bin ein wenig verwirrt über Javascript undefined & null.
null
verhält sich im Allgemeinen ähnlich wie die Konzepte anderer Skriptsprachen für die Out-of-Band-Objekte "null", "nil" oder "None".
undefined
ist hingegen eine seltsame JavaScript-Macke. Es ist ein Singleton-Objekt, das Out-of-Band-Werte darstellt, im Wesentlichen ein zweites ähnliches, aber unterschiedliches null
. Es wird angezeigt:
-
Wenn Sie eine Funktion mit weniger Argumenten aufrufen als in der Liste der Argumente in der function
Anweisungslisten, werden die nicht übergebenen Argumente auf undefined
. Das können Sie z. B. mit einem Test überprüfen:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Mit dieser Methode können Sie nicht unterscheiden zwischen dosomething(1)
y dosomething(1, undefined)
; arg2
ist in beiden Fällen derselbe Wert. Wenn Sie den Unterschied feststellen wollen, können Sie sich Folgendes ansehen arguments.length
aber solche optionalen Argumente sind im Allgemeinen nicht sehr lesbar.
-
Wenn eine Funktion keine return value;
gibt es zurück undefined
. Im Allgemeinen besteht keine Notwendigkeit, ein solches Ergebnis zu verwenden.
-
Wenn Sie eine Variable deklarieren, indem Sie ein var a
Anweisung in einem Block verwenden, ihr aber noch keinen Wert zugewiesen haben, ist sie undefined
. Auch darauf sollten Sie sich eigentlich nie verlassen müssen.
-
Das Gespenst typeof
Operator kehrt zurück 'undefined'
wenn sein Operand eine einfache Variable ist, die nicht existiert, anstatt einen Fehler zu erzeugen, wie es normalerweise der Fall wäre, wenn man versucht, auf sie zu verweisen. (Sie können auch eine einfache, in Klammern eingeschlossene Variable angeben, aber no ein vollständiger Ausdruck mit einer nicht existierenden Variablen). Das ist auch nicht sehr nützlich.
-
Dies ist das umstrittene Thema. Wenn Sie auf eine Eigenschaft eines Objekts zugreifen, das nicht existiert, erhalten Sie nicht sofort eine Fehlermeldung wie in jeder anderen Sprache. Stattdessen erhalten Sie eine undefined
Objekt. (Und wenn Sie dann versuchen, dieses Objekt zu verwenden undefined
Objekt später im Skript wird es auf eine seltsame Art und Weise schief gehen, die viel schwieriger zu verfolgen ist, als wenn JavaScript gerade einen Fehler ausgelöst hätte).
Dies wird häufig verwendet, um das Vorhandensein von Eigenschaften zu prüfen:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Da Sie jedoch die Möglichkeit haben undefined
wie jeder andere Wert:
o.prop= undefined;
die nicht wirklich zuverlässig feststellt, ob die Eigenschaft vorhanden ist. Besser ist die Verwendung der in
Operator, der in der ursprünglichen Netscape-Version von JavaScript nicht enthalten war, jetzt aber überall verfügbar ist:
if ('prop' in o)
...
Zusammengefasst, undefined
ist ein JavaScript-spezifisches Durcheinander, das alle verwirrt. Abgesehen von optionalen Funktionsargumenten, für die JS keinen anderen eleganteren Mechanismus hat, undefined
sollten vermieden werden. Er hätte nie 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 bedeutet if (!testvar)
tatsächlich tun? Wird auf undefiniert und null oder nur auf undefiniert getestet?
Ein solcher "Wahrheitsgehaltstest" prüft false
, undefined
, null
, 0
, NaN
und leere Zeichenfolgen. Aber in diesem Fall, ja, es ist wirklich undefined
mit dem sie sich befasst. IMO sollte dies expliziter formuliert werden und sagen if (testvar!==undefined)
.
Wenn eine Variable definiert ist, kann ich sie wieder auf undefiniert zurücksetzen (also die Variable löschen).
Sie können sicherlich zuweisen undefined
zu, aber dadurch wird die Variable nicht gelöscht. Nur die delete object.property
Operator entfernt wirklich Dinge.
delete
ist eigentlich für Eigenschaften und nicht für Variablen als solche gedacht. Die Browser lassen Sie mit einfachen delete variable
aber es ist keine gute Idee und wird im strengen Modus von ECMAScript Fifth Edition nicht funktionieren. Wenn Sie einen Verweis auf etwas freigeben wollen, damit es als Müll gesammelt werden kann, wäre es üblicher zu sagen variable= null
.
Kann ich undefiniert als Parameter übergeben?
Ja.