353 Stimmen

Kann ich Variablen auf undefiniert setzen oder undefiniert als Argument übergeben?

Ich bin ein wenig verwirrt über JavaScript's undefined y null Werte.

Was bedeutet if (!testvar) tatsächlich tun? Testet es auf undefined y null oder einfach undefined ?

Sobald eine Variable definiert ist, kann ich sie wieder auf undefined (wodurch die Variable gelöscht wird)?

Kann ich bestehen? undefined als Parameter? z.B.:

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");

584voto

bobince Punkte 512550

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:

  1. 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.

  2. Wenn eine Funktion keine return value; gibt es zurück undefined . Im Allgemeinen besteht keine Notwendigkeit, ein solches Ergebnis zu verwenden.

  3. 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.

  4. 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.

  5. 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.

25voto

Tatu Ulmanen Punkte 119424

Sie können (sollten?) nicht irgendetwas als undefiniert definieren, da die Variable dann nicht mehr undefiniert wäre - Sie haben nur definiert es zu etwas.

Sie können (sollten?) nicht bestehen undefined zu einer Funktion. Wenn Sie einen leeren Wert übergeben wollen, verwenden Sie null stattdessen.

Die Erklärung if(!testvar) auf boolesche Wahr/Falsch-Werte prüft, wird in diesem Fall geprüft, ob testvar wertet aus zu false . Per Definition, null y undefined sollte auch nicht als true ou false , aber JavaScript wertet null als false und gibt einen Fehler aus, wenn Sie versuchen, eine undefinierte Variable auszuwerten.

Zur ordnungsgemäßen Prüfung auf undefined ou null verwenden Sie diese:

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }

19voto

Todd Punkte 827

Der grundlegende Unterschied besteht darin, dass undefined y null unterschiedliche Konzepte darstellen.

Wenn nur null verfügbar wäre, könnten Sie nicht feststellen, ob null absichtlich als Wert gesetzt wurde oder ob der Wert noch nicht gesetzt wurde, es sei denn, Sie haben eine umständliche Fehlerbehebung verwendet: z. B.

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

Wenn Sie den Wert jedoch absichtlich auf null , strenge Gleichheit mit undefined fehlschlägt, so dass Sie unterscheiden können zwischen null y undefined Werte:

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;

Schauen Sie sich die Referenz hier an, anstatt sich auf Leute zu verlassen, die abschätzig Dinge sagen wie "Zusammenfassend lässt sich sagen, dass undefined ein JavaScript-spezifisches Chaos ist, das jeden verwirrt". Nur weil Sie verwirrt sind, bedeutet 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 vervollständigt das allgemeine Konzept, dass ein boolesches Ergebnis true , false , unbekannt ( null ), kein Wert ( undefined ), oder etwas ging schief ( error ).

http://en.wikipedia.org/wiki/Undefined_value

14voto

rahul Punkte 179143

Der beste Weg, um auf einen Nullwert zu prüfen, ist

if ( testVar !== null )
{
    // do action here
}

und für undefinierte

if ( testVar !== undefined )
{
    // do action here
}

Sie können eine avariable mit undefined zuweisen.

testVar = undefined;
//typeof(testVar) will be equal to undefined.

8voto

JA, das können Sie, denn undefiniert ist definiert als undefiniert.

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

Ihr Fall:

test("value1", undefined, "value2")

können Sie auch erstellen. Ihre eigene undefinierte Variable:

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X