CoffeeScript undefiniert

89

In Javascript überprüfen wir einfach, ob eine Variable nie erstellt wurde

if (typeof MyVariable !== "undefined"){ ... }

Ich habe mich gefragt, wie ich das in Coffeescript mache? ... Ich versuche so etwas

if (MyVariable?false){ ... }

Diese Überprüfung, ob dies MyVariableeine Funktion ist, ruft MyVariable (false) auf, wenn nicht, ruft sie void (0) oder ähnliches auf.

Jaider
quelle
Versuchen Sie, if MyVariable isnt undefinedwelche produziert if (MyVariable !== void 0).
Yami Odymel

Antworten:

163

Endlich habe ich diesen einfachen Weg gefunden:

if (MyVariable?){ ... }

das wird erzeugen:

if (typeof MyVariable !== "undefined" && MyVariable !== null){ ... }

UPDATE 04/07/2014 Demo Link

Geben Sie hier die Bildbeschreibung ein

Jaider
quelle
58
Eigentlich hat es nur generiertitem != null
Pencilcheck
13
@Pencilcheck - Das liegt daran, dass der Compiler festgestellt hat, dass das Element in Ihrem Code definiert wurde. (auch, toller Name - obwohl es jetzt Tablet-Check für mich ist :) Diese Antwort nimmt auch Nullwerte auf, die sich sehr von undefinierten unterscheiden. Es scheint wie eine Antwort auf eine andere Frage IMHO
Seth
3
@ Seth, ja, ich werde die ganze Zeit von dieser Nuance verbrannt, was die nächste logische Frage aufwirft: Bietet CS eine syntaktische Verknüpfung für Folgendes: MyVariable = MyMethod; if MyVariable? ... wohin könnte MyMethod zurückkehren undefined? Oder müssen Sie dann darauf zurückgreifen if typeof myVariable isnt 'undefined'?
Neverfox
1
@neverfox Letzteres, soweit mir bekannt ist (undefinierte Typprüfung) - CoffeeScript ist der Meinung, dass null und undefiniert zusammengeführt werden sollten.
Seth
6
@ Seth, nicht wirklich. Nicht strenge Vergleiche ( ==und !=) behandeln tatsächlich nullund undefinedals gleiche Werte, testen also item != nulltatsächlich sowohl für nullals auch undefinedgleichzeitig. Es tut nicht, wenn es geschrieben ist als item !== null.
Toriningen
26

Um Ihre Frage zu beantworten:

if typeof myVariable isnt 'undefined' then # do stuff

Die Lösung von Magrangs funktioniert in den meisten Fällen, außer wenn Sie zwischen undefiniert und falsch unterscheiden müssen (z. B. wenn myVariable wahr, falsch oder undefiniert sein kann).

Und nur um darauf hinzuweisen, sollten Sie Ihre Bedingungen nicht in Klammern setzen und keine geschweiften Klammern verwenden.

Das thenSchlüsselwort kann verwendet werden, wenn sich alles in derselben Zeile befindet. Andernfalls verwenden Sie Einrückungen, um anzugeben, welcher Code sich in der Bedingung befindet.

if something  
    # this is inside the if-statement  
# this is back outside of the if-statement

Hoffe das hilft!

Soundslikeneon
quelle
Das isntSchlüsselwort entspricht !=Coffeescript und ist möglicherweise besser lesbar, wenn Sie an Javascript gewöhnt sind.
Aaron Dufour
12
Entspricht !==nicht!=
Mischa Arefiev
1
Dies ist die spezifischste Antwort - viele der anderen interagieren auch mit Nullwerten. Thx
Seth
1
@MischaArefiev !=in Coffee, was !==in JavaScript übersetzt wird.
Suzana
14

Diese Antwort gilt für eine ältere Version von Coffeescript. Siehe Jaiders Antwort oben, wenn Sie eine aktuellere Antwort wünschen (Stand Juli 2014).

Dieses Coffeescript macht, was Sie wollen, denke ich:

if not MyVariable?
  MyVariable = "assign a value"

Welches produziert:

if (!(typeof MyVariable !== "undefined" && MyVariable !== null)) {
  MyVariable = "assign a value";
}

Nb Wenn Sie zuerst eine Zuweisung vornehmen MyVariable, auch wenn Sie MyVariablewie in diesem Code auf undefiniert gesetzt haben , wird dies kompiliert zu:

if (!(MyVariable != null)) {
  MyVariable = "assign a value";
}

Ich glaube, das funktioniert, weil das !=von CoffeeScripts verwendete Existential Operator(das Fragezeichen) dazu zwingt undefined, gleich zu sein null.

ps Kannst du tatsächlich if (MyVariable?false){ ... }zur Arbeit gehen? Es wird für mich nicht kompiliert, es sei denn, zwischen dem existenziellen Operator und false steht ein Leerzeichen, dh MyVariable? falseCoffeeScript überprüft es dann wie eine Funktion, da falsees seiner Meinung nach ein Parameter für Sie ist MyVariable, zum Beispiel :

if MyVariable? false
  alert "Would have attempted to call MyVariable as a function"
else
  alert "but didn't call MyVariable as it wasn't a function"

Produziert:

if (typeof MyVariable === "function" ? MyVariable(false) : void 0) {
  alert("Would have attempted to call MyVariable as a function");
} else {
  alert("but didn't call MyVariable as it wasn't a function");
}
AJP
quelle
3
Das ist ein altes Kaffeeskript. das variable?kompiliert jetzt nur noch zu variable! = null
Gambai
@ Gambai bist du sicher? Die Website zeigt ... !== null immer
AJP
1
Ja, der Compiler lässt jetzt manchmal das ! = Undefined als Optimierung weg, da die Variable irgendwo im Code definiert werden soll. Ich sage sollte, weil der Compiler nicht immer richtig funktioniert ...
Suzana
@Suzana_K gut zu wissen. Ich bin mir sicher, dass Leute, die auf diese Frage stoßen, eine aktuelle Antwort wünschen. Sie können meine gerne bearbeiten oder eine neue Antwort posten, und ich werde von oben auf sie verlinken. Ich verwende nach der Einführung von ES6 / TypeScript kein CoffeeScript mehr, daher kann ich die Antwort nicht aktualisieren. Eigentlich sieht es so aus, als würde Jaiders
AJP
11
typeof MyVariable isnt "undefined" 

von js2coffee

Jonathan
quelle
9

Achten Sie zusätzlich zu Jaiders Antwort oben (ich konnte aufgrund unzureichender Reputation keinen Kommentar abgeben) darauf , dass es sich um einen anderen Fall handelt, wenn es sich um etwas in einem Objekt / Array handelt:

someArray['key']?

wird konvertiert zu:

someArray['key'] != null

Screenshot von js2coffee.org :

js2coffee.org

LongYC
quelle
Sie prüfen, ob der Schlüssel vorhanden ist. Dies ist also sinnvoll. Wenn Sie auch überprüfen müssen, ob das Array vorhanden ist, versuchen Sie es mit someArray? ['Key']?
Joshua Davison
6

Ich benutze nur:

if (myVariable)
    //do stuff

Da undefiniert falsch ist, wird es nur dann funktionieren, wenn myVariable nicht undefiniert ist.

Sie müssen sich nur bewusst sein, dass es für Werte, die 0, "" und null sind, "Sachen macht"

Magrangs
quelle
1
Ich bevorzuge diese Methode, solange myVariablees sich nicht um einen falschen Wert wie nulloder handelt 0.
Bryan Downing
3

Der sauberste Weg, eine Variable einer undefinierten und nicht null Variablen zuzuweisen, ist unless:

unless ( myVar? )
    myVar = 'val'
Narren
quelle
6
myVar ?= 'val'
Ricket
2

Warum nicht einfach die ODER-Sprache verwenden?

myVar or 'val'

Das Ergebnis entspricht also myVar, es sei denn, es ist undefiniert. In diesem Fall entspricht es 'val'.

l3x
quelle
3
Mit diesem Idiom kehrt jeder falsish Wert ‚val‘ statt , was es sein sollte - einschließlich '', 0.0und false. Welches ist wahrscheinlich nicht unerwünscht.
Toriningen