Was genau bedeutet undefiniert in JavaScript? Warum ist es dort? Welche Verwendungen hat es? Wie könnte es nützlich sein?


11

In JavaScript haben wir etwas, das als undefiniert bezeichnet wird . Ich habe etwas gesagt, weil ich wirklich nicht weiß, ob es sich um eine Basisklasse, eine integrierte Variable, ein Schlüsselwort oder etwas anderes handelt. Ich weiß nur, dass es da ist.

Um es in Aktion zu sehen, können Sie einfach schreiben:

undefined;
typeof undefined;

Kann mir bitte jemand erklären, warum dieses Ding in JavaScript eingefügt wurde? Wir haben nullWert in dieser Sprache, daher sollte es nicht so sein null. In anderen Sprachen setzen wir den Wert einer Eigenschaft oder Variablen einfach auf null, wenn wir ihn nicht kennen. Hier können wir das Gleiche tun.

Wie können wir dieses Ding in JavaScript verwenden?



Dies wurde ad nauseum hier diskutiert stackoverflow.com/questions/6999291/…
Paul

Antworten:


13

Es gibt ZWEI Dinge, die Sie über undefinierte verstehen müssen ...

  • Der Typ undefined , der nur einen Wert haben kann .
  • die Variable undefined

Lesen Sie nun Folgendes sorgfältig durch ...

  • Es gibt so viele Werte vom Typ number(10, 10.01, 1e1). Es kann jedoch nur einen Wert vom Typ geben undefined, und dieser Wert wird in der Variablen gespeichert undefined. Dieser Wert hat NO literal Darstellung - beispielsweise Zahlenwerte 1, 100, 1e-1sind alle Literale der Typennummer, aber die in der Variable gespeicherten Wert undefinedhat kein Literal Form.

  • undefinedist eine Variable, nur eine normale Variable, die JavaScript deklariert und ihr den Wert type undefinedim globalen Bereich zuweist . Sie können also Folgendes tun ...

  Art von undefiniert; // "nicht definiert"

  undefiniert = 100;
  Art von undefiniert; // "Nummer"

  undefined = void 0;
  Art von undefiniert; // "nicht definiert"

  window.undefined === undefined; // wahr
  window.undefined === void 0; // wahr
  
  • Wenn Sie die Variable nicht verwenden möchten undefined, können Sie den Wert des Typs undefineddurch den Ausdruck generieren, void 0dessen einziger Zweck darin besteht, einen Wert vom Typ zurückzugeben undefined.

... kann mir bitte jemand erklären, warum dieses Ding in JavaScript eingefügt wurde ...

NEIN. Genauso wie niemand erklären kann, warum nicht deklarierte Variablen nicht lokal, sondern global angewendet werden. Sie müssen sich nur darin schulen, es intelligent zu nutzen, anstatt zu versuchen, Rechtfertigungen für seine Existenz zu finden.

... wir haben Nullwert ...

Obwohl nulles Dinge kann undefined, ist es mehr oder weniger mit objectsSkalaren verbunden als mit Skalaren. In der Tat betrachtet nullsich JavaScript als Objekt - typeof nullgibt "Objekt" zurück.

Meiner Meinung nach besteht das Endergebnis darin, NICHT zu versuchen, die absoluten Zwecke von undefinedund null- zu begründen und sie in Ihrem Code verständlich zu verwenden, damit Ihr Code lesbar, wartbar und wiederverwendbar ist.


2
Gute Erklärung @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, scheint, dass JavaScript ein bisschen weniger als eine logische Sprache ist und wir uns einfach daran gewöhnen müssen, wie beim Experimentieren einer neuen Welt.
Saeed Neamati

1
"deren einziger Zweck darin besteht, einen Wert vom Typ zurückzugeben undefined". Wertet tatsächlich voideinen Ausdruck aus, ignoriert den Rückgabewert und gibt den undefinedWert zurück. Wie für die Unterschiede. undefinedwird von der JS-Engine verwendet, um zu sagen, dass dieses Ding keinen Wert hat. nullwird von DIR benutzt, um zu sagen, dass dieses Ding keinen Wert hat. Es gibt eine klare Unterscheidung.
Raynos

1
undefined = 100; typeof undefined;Gibt für mich "undefined" zurück. Wenn Sie versuchen, null zuzuweisen, wird eine Fehlermeldung angezeigt. Ich wollte das nur für zukünftige Leser klarstellen.
Josh Rumbut

6

Es tut uns leid, dass Sie eine ältere Frage beantwortet haben, aber der Grund, warum Sie sowohl undefiniert als auch null benötigen, ist einfach: In einer prototypbasierten Enten-Typisierungssprache müssen Sie unbedingt zwischen "Dieses Objekt definiert keinen Wert für X" und "Dieses Objekt sagt, X ist" unterscheiden nichts / null / leer ".

Ohne diese Funktion gibt es keine Möglichkeit, die Prototypenkette zu durchlaufen, sodass die Vererbung nicht funktionieren kann. Sie müssen in der Lage sein, festzustellen, dass obj.someProp undefiniert ist, damit Sie sich obj.prototype.someProp ansehen und die Kette weiterleiten können, bis Sie einen Wert finden. Wenn obj.someProp null zurückgeben würde, wäre es unmöglich zu wissen, ob es wirklich null ist oder nur "Schau dir meinen Prototyp an" bedeutet. Der einzige andere Weg, dies zu umgehen, besteht darin, hinter den Kulissen etwas klobige Magie zu injizieren, die Ihre Fähigkeit beeinträchtigt, mit den Prototypenketten zu fusseln und verschiedene andere Teile der schwarzen Magie von JS auszuführen.

Wie ein Großteil von Javascript wirkt die Idee von undefiniert und null zunächst wackelig und dumm, später absolut brillant (dann zurück zu wackelig und dumm, aber mit einer vernünftigen Erklärung).

Eine Sprache wie C # wird nicht kompiliert, wenn Sie auf eine nicht vorhandene Eigenschaft zugreifen, und andere dynamische Sprachen lösen zur Laufzeit häufig Ausnahmen aus, wenn Sie eine nicht vorhandene Eigenschaft berühren. Dies bedeutet, dass Sie spezielle Konstrukte verwenden müssen, um sie zu testen. Plus-Klassen bedeuten, dass Sie beim Instanziieren eines Objekts bereits seine Vererbungskette und alle Eigenschaften kennen - in JS kann ich einen Prototyp in 15 Schritten der Kette ändern, und diese Änderungen werden für vorhandene Objekte angezeigt.


3

Es gibt eine globale Variable undefined, die auf den undefinierten Wert gesetzt ist. Böse Leute können es auf etwas anderes setzen, also ist es wahrscheinlich am besten, ihm nicht zu vertrauen.

  • Der undefinierte Wert ist der Rückgabewert einer Funktion, die keinen Wert zurückgibt.
  • Der undefinierte Wert ist der Wert einer Variablen, die nicht zugewiesen wurde.
  • Der undefinierte Wert ist der Wert eines Parameters, der nicht übergeben wurde.
  • Der undefinierte Wert ist der Wert einer Eigenschaft, die nicht zugewiesen wurde.
  • 'undefined' ist der Typ einer nicht deklarierten Variablen. ( typeof undeclaredVariable == 'undefined'Wenn Sie versuchen, den Wert einer unterdefinierten Variablen zu lesen, werden Sie geworfen ReferenceError.)

nullist subtil kaputt, weil typeof null == 'object'. Ich weiß nicht warum wir haben undefinedund nullwahrscheinlich einen historischen Unfall.


2

Nun, undefinedist ein Sentinel-Wert, der durch Auswerten von etwas erhalten wird, das nicht definiert ist, im Gegensatz zu nulldem Wert, der genau definiert ist, um nichts darzustellen .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

So ist beispielsweise der Rückgabewert einer Funktion, die keinen Rückgabewert definiert, undefiniert. Der Wert einer Eigenschaft, die nicht für ein Objekt definiert ist, ist undefiniert. Der Rückgabewert einer Anweisung, die kein Ausdruck ist, ist undefiniert (obwohl dies nur in der Konsole angezeigt wird).
Bitte beachten Sie , dass Sie können eine Funktion erstellen, die explizit zurückkehrt undefinedund Sie können explizit eine Eigenschaft mit dem Wert definieren undefinedauf einem Objekt, denn am Ende ist es ein gültiger Wert ist. Sie würden dies tun, um explizit zu kommunizieren, dass etwas nicht definiert ist .

Man könnte sich die Beziehung von undefinedund nullals die zwischen NaNund vorstellen 0.


„Der Rückgabewert einer Funktion, die keinen Rückgabewert nicht definiert ist undefiniert“, meinst du das undefinedist void?
Saeed Neamati

@ Saat: Nicht ganz. voidin JavaScript ist ein unärer Operator , der jedes Argument akzeptiert und den Wert zurückgibt undefined.
back2dos
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.