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

Lesezeit: 10 Minuten

Benutzer-Avatar
AJ.

Ich bin ein bisschen verwirrt über JavaScript undefined und null Werte.

Was macht if (!testvar) eigentlich tun? Testet es auf undefined und null oder nur undefined?

Sobald eine Variable definiert ist, kann ich sie wieder löschen undefined (daher die Variable löschen)?

Kann ich passieren undefined als Parameter? Z.B:

function test(var1, var2, var3) {

}

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

  • Antwort: stackoverflow.com/a/5076962/1697099

    – Premraj

    13. Mai 2015 um 9:59 Uhr

Benutzer-Avatar
Bobine

Ich bin etwas 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, 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 null. Es kommt auf:

  1. Wenn Sie eine Funktion mit weniger Argumenten als der Argumentliste in der aufrufen function Anweisungslisten werden die nicht übergebenen Argumente gesetzt undefined. Das kannst du testen mit z.B.:

    function dosomething(arg1, arg2) {
        if (arg2===undefined)
        arg2= DEFAULT_VALUE_FOR_ARG2;
        ...
    }
    

    Mit dieser Methode können Sie den Unterschied zwischen nicht feststellen dosomething(1) und dosomething(1, undefined); arg2 wird in beiden den gleichen Wert haben. Wenn Sie den Unterschied erkennen müssen, können Sie ihn sich ansehen arguments.lengthaber solche optionalen Argumente sind im Allgemeinen nicht sehr lesbar.

  2. Wenn eine Funktion keine hat return value;es kehrt zurück undefined. Es besteht im Allgemeinen keine Notwendigkeit, ein solches Rückgabeergebnis zu verwenden.

  3. Wenn Sie eine Variable deklarieren, indem Sie a var a -Anweisung in einem Block, aber ihr noch keinen Wert zugewiesen haben, ist es undefined. Auch hier sollten Sie sich nicht wirklich darauf verlassen müssen.

  4. Das Gespenstische typeof Operator kehrt zurück 'undefined' wenn sein Operand eine einfache Variable ist, die nicht existiert, anstatt einen Fehler auszulösen, wie es normalerweise passieren würde, wenn Sie versuchen würden, darauf zu verweisen. (Sie können ihm auch eine einfache Variable in Klammern geben, aber nicht ein vollständiger Ausdruck, der eine nicht existierende Variable enthält.) Auch das hat nicht viel Sinn.

  5. Dies ist das umstrittene. Wenn Sie auf eine Eigenschaft eines Objekts zugreifen, die nicht existiert, erhalten Sie nicht sofort einen Fehler wie in jeder anderen Sprache. Stattdessen erhalten Sie eine undefined Objekt. (Und wenn Sie dann versuchen, das zu benutzen undefined Objekt später im Skript wird es auf eine seltsame Weise schief gehen, die viel schwieriger aufzuspüren ist, als wenn JavaScript sofort einen Fehler ausgegeben hätte.)

    Dies wird oft verwendet, um das Vorhandensein von Eigenschaften zu überprüfen:

    if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
       ...do something...
    

    Da kann man aber zuordnen undefined wie jeder andere Wert:

    o.prop= undefined;
    

    das erkennt nicht wirklich, ob die Eigenschaft zuverlässig vorhanden ist. Verwenden Sie besser die in -Operator, der nicht in der ursprünglichen Netscape-Version von JavaScript enthalten war, aber jetzt überall verfügbar ist:

    if ('prop' in o)
        ...
    

Zusammenfassend, undefined ist ein JavaScript-spezifisches Durcheinander, das alle verwirrt. Abgesehen von optionalen Funktionsargumenten, für die JS keinen eleganteren Mechanismus hat, undefined sollte vermieden werden. Es 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 macht if (!testvar) eigentlich tun? Testet es auf undefiniert und null oder nur undefiniert?

Ein solcher “Wahrheits”-Test prüft gegen false, undefined, null, 0, NaN und leere Zeichenfolgen. Aber in diesem Fall ist es das wirklich undefined es geht um. IMO, es sollte expliziter darüber und sagen if (testvar!==undefined).

Sobald eine Variable definiert ist, kann ich sie wieder auf undefiniert zurücksetzen (daher die Variable löschen).

Sie können sicherlich zuordnen undefined dazu, aber das wird die Variable nicht löschen. Nur der delete object.property Operator entfernt wirklich Dinge.

delete ist eher für Eigenschaften als für Variablen als solche gedacht. Mit Browsern kommen Sie direkt davon delete variable, aber es ist keine gute Idee und funktioniert nicht im strikten Modus von ECMAScript Fifth Edition. Wenn Sie einen Verweis auf etwas freigeben möchten, damit es von der Garbage Collection erfasst werden kann, wäre es üblicher zu sagen variable= null.

kann ich undefined als Parameter übergeben?

Ja.

  • Was für eine fantastische Antwort. Ich habe gerade den JavaScript-Test nicht bestanden: perfectionkills.com/javascript-quiz Später werde ich Ihre Antwort noch einmal lesen und den Test erneut versuchen!

    – Geschicklichkeitsdrick

    10. Februar 2010 um 16:09 Uhr

  • fest, ta. (Ich neige dazu, mir keine allzu großen Gedanken über die Neuzuweisung zu machen, da es so viele Dinge gibt, die ein Skript neu definieren könnte, um alles durcheinander zu bringen, dass der allgemeine Fall unmöglich zu lösen ist.)

    – Bobin

    13. April 2010 um 16:44 Uhr

  • @bobice undefined ist ein Singleton-Objekt? Wie meinst du das? Es ist ein primitiver Wert und kein Objekt.

    – Sime Vidas

    23. November 2010 um 19:08 Uhr

  • @Hortitude: Das ist Punkt (4). Ich würde es generell nicht tun typeof foo=='undefined'; Es wird in der Regel für (4a) Global-Sniffing verwendet, in diesem Fall würde ich es vorziehen, explizit zu sein und zu sagen 'foo' in windowoder (4b) Testen gegen die undefined-Wert selbst, in diesem Fall würde ich es vorziehen, lesbar zu sein und zu sagen foo===undefined. In der Theorieprüfung typeof gegen 'undefined' könnte einen Anwendungsfall haben, den andere Konstrukte nicht bieten könnten: das Sniffing für die Existenz lokaler Variablen. In Wirklichkeit wissen Sie jedoch so ziemlich immer, welche Variablen lokal deklariert sind.

    – Bobin

    10. August 2011 um 19:44 Uhr

  • Eine Einschränkung bei #2, normalerweise eine Funktion bei Nr return Anweisung zurück undefinedaber wenn die Funktion ein Konstruktor ist (aufgerufen mit der new Operator) gibt es das neue Objekt zurück (den Wert von this innerhalb des Konstruktors), obwohl kein a vorhanden ist return Aussage. console.log((function (){}())); kehrt zurück undefined. console.log((new function (){}())); gibt ein Objekt zurück.

    – Nutzloser Code

    17. April 2013 um 22:16 Uhr


Benutzer-Avatar
Tatu Ulmanen

Sie können (sollten nicht?) nichts als undefiniert definieren, da die Variable nicht mehr undefiniert wäre – Sie eben definiert es zu etwas.

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

Die Aussage if(!testvar) prüft auf boolesche Wahr/Falsch-Werte, dieser spezielle testet ob testvar wertet zu false. Per Definition, null und undefined sollte auch nicht als bewertet werden true oder falseaber JavaScript wertet aus null wie falseund gibt einen Fehler aus, wenn Sie versuchen, eine nicht definierte Variable auszuwerten.

Um richtig zu testen undefined oder nullbenutze diese:

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

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

  • Die Triple-Equals-Überprüfungen werden auch auf den Typ durchgeführt, sodass keine Typumwandlung durchgeführt wird. Douglas Crockford rät davon ab, die Typumwandlungsoperatoren (== und !=).

    – Geschicklichkeitsdrick

    10. Februar 2010 um 9:30 Uhr

  • Sie können etwas als undefiniert definieren. var a= undefined. Du kannst passieren fn(undefined). Wenn Sie den Unterschied zwischen einer undefinierten Eigenschaft finden möchten p eines Objektes ound eine Eigenschaft p das definiert und eingestellt hat undefinedmüssen Sie die verwenden 'p' in o Operator.

    – Bobin

    10. Februar 2010 um 10:23 Uhr

  • Gibt es einen Grund, warum man nicht testen sollte? testvar === undefined eher als komplizierter typeof(testvar) === "undefined"?

    – ddaa

    10. Februar 2010 um 10:25 Uhr

  • Es gibt noch einen weiteren guten Grund für die Verwendung von a typeof Test auf undefinierte Variablen: anders null, undefined ist einfach eine Eigenschaft des globalen Objekts und kann selbst neu definiert werden. Es braucht nur einen bestimmten Codierungsstil und ein fehlendes Gleichheitszeichen und undefined wird stillschweigend geändert: if (undefined = someVar) {...}

    – Tim unten

    13. April 2010 um 15:48 Uhr


  • @IanGrainger: ECMAScript 5 (in aktuellen Versionen aller Browser implementiert) behebt dies meistens durch Erstellen undefined eine unveränderliche Eigenschaft des globalen Objekts, daher ist es sicherer als früher. Es ist jedoch weiterhin möglich, eine veränderliche Variable namens zu definieren undefined innerhalb einer Funktion, sodass das Problem noch nicht ganz verschwunden ist.

    – Tim unten

    3. September 2013 um 11:51 Uhr

Der grundlegende Unterschied besteht darin undefined und null repräsentieren unterschiedliche Konzepte.

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 Fehlererkennung verwendet: z

var a;

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

Wenn Sie den Wert jedoch absichtlich auf setzen nullstrikte Gleichheit mit undefined schlägt fehl, sodass Sie zwischen ihnen unterscheiden können null und 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 darauf zu verlassen, dass Leute abweisend Müll sagen wie “Zusammenfassend ist undefined ein JavaScript-spezifisches Durcheinander, das alle verwirrt”. Nur weil Sie verwirrt sind, bedeutet das nicht, dass es ein Durcheinander 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 sein kann true, falseUnbekannt (null), kein Wert (undefined), oder etwas ist schief gelaufen (error).

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

  • Und weiterhin null hätte prima funktioniert. a == null ist true weil Javascript Typzwang ist.

    – Rukschan

    24. Januar 2020 um 7:40 Uhr

Benutzer-Avatar
rahul

Der beste Weg, um nach Nullwerten zu suchen, ist

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

und für undefiniert

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

Sie können eine Variable mit undefined zuweisen.

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

Ja, du kannst, weil undefiniert ist definiert als undefiniert.

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

dein Fall:

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

du kannst auch schaffen Ihre eigene undefinierte Variable:

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

Um Ihre erste Frage zu beantworten, der Not-Operator (!) wird alles, was ihm übergeben wird, in einen booleschen Wert umwandeln. So null, 0, false, NaN und "" (leerer String) erscheinen alle falsch.

JavaScript, wie man eine Variable in der Kommandozeile auf undefiniert setzt:

Setzen Sie eine Variable in der auf undefiniert js Javascript-Befehlszeilenterminal, das mit Java unter Ubuntu 12.10 geliefert wird.

el@defiant ~ $ js

js> typeof boo
"undefined"

js> boo
typein:2: ReferenceError: boo is not defined

js> boo=5
5

js> typeof boo
"number"

js> delete(boo)
true

js> typeof boo
"undefined"

js> boo
typein:7: ReferenceError: boo is not defined

Wenn Sie eine Variable in einem Javascript auf undefiniert setzen:

Fügen Sie dies in myjs.html ein:

<html>
<body>
    <script type="text/JavaScript">
        document.write("aliens: " + aliens);
        document.write("typeof aliens: " + (typeof aliens));
        var aliens = "scramble the nimitz";
        document.write("found some aliens: " + (typeof aliens));
        document.write("not sayings its aliens but... " + aliens);
        aliens = undefined;
        document.write("aliens deleted");
        document.write("typeof aliens: " + (typeof aliens));
        document.write("you sure they are gone? " + aliens);
    </script>
</body>
</html>

Es druckt dies:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

WARNUNG! Wenn Sie Ihre Variable auf undefiniert setzen, setzen Sie Ihre Variable auf eine andere Variable. Wenn eine hinterhältige Person rennt undefined = 'rm -rf /'; Wenn Sie dann Ihre Variable auf undefiniert setzen, erhalten Sie diesen Wert.

Sie fragen sich vielleicht, wie ich den undefinierten Wert aliens am Anfang ausgeben kann und es trotzdem laufen lassen kann. Es liegt am Javascript-Heben: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

1315170cookie-checkKann ich Variablen auf undefiniert setzen oder undefiniert als Argument übergeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy