CoffeeScript non défini

89

En javascript pour vérifier si une variable n'a jamais été créée, il suffit de faire

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

Je me demandais comment je fais ça dans coffeescript? ... J'essaye quelque chose comme

if (MyVariable?false){ ... }

mais ce contrôle si MyVariableest une fonction si c'est le cas qui appellera MyVariable (false) sinon cela appellera void (0) ou quelque chose comme ça.

Jaider
la source
Essayez if MyVariable isnt undefinedce qui produit if (MyVariable !== void 0).
Yami Odymel

Réponses:

163

Enfin, j'ai trouvé ce moyen simple de le faire:

if (MyVariable?){ ... }

qui générera:

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

MISE À JOUR 04/07/2014 Lien Démo

entrez la description de l'image ici

Jaider
la source
58
En fait, il n'a généré queitem != null
Pencilcheck
13
@Pencilcheck - c'est parce que le compilateur a déterminé que cet élément était défini dans votre code. (aussi, grand nom - bien que ce soit un contrôle de la tablette pour moi maintenant :) Cette réponse prend également des valeurs nulles qui sont très différentes de non définies. Cela semble être une réponse à une question différente IMHO
Seth
3
@Seth, oui je suis tout le temps brûlé par cette nuance, ce qui soulève la question logique suivante: est-ce que CS offre un raccourci syntaxique pour ce qui suit: MyVariable = MyMethod; si MyVariable? ... où MyMethod pourrait revenir undefined? Ou devez-vous alors recourir if typeof myVariable isnt 'undefined'?
neverfox
1
@neverfox le dernier pour autant que je sache (vérification de type non défini) - CoffeeScript pense que nul et non défini devraient être confondus.
Seth
6
@Seth, pas vraiment. Les comparaisons non strictes ( ==et !=) traitent en fait nullet undefinedcomme des valeurs égales, donc item != nulltestent réellement les deux pour nullet undefineden même temps. Ce n'est pas le cas, si c'est écrit item !== null.
toriningen
26

Tout d'abord, pour répondre à votre question:

if typeof myVariable isnt 'undefined' then # do stuff

La solution de Magrangs fonctionnera dans la plupart des cas, sauf lorsque vous devez faire la distinction entre undefined et false (par exemple, si myVariable peut être true, false ou undefined).

Et juste pour souligner, vous ne devriez pas mettre vos conditions entre parenthèses, et vous ne devriez pas utiliser d'accolades.

Le thenmot-clé peut être utilisé si tout est sur la même ligne, sinon utilisez l'indentation pour indiquer le code à l'intérieur de la condition.

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

J'espère que cela t'aides!

sonslikeneon
la source
Le isntmot clé est équivalent à !=dans Coffeescript, et peut être plus lisible si vous êtes habitué à javascript.
Aaron Dufour
12
Équivalent à !==, pas!=
Mischa Arefiev
1
C'est la réponse la plus spécifique - beaucoup d'autres interagissent également avec des valeurs nulles. Thx
Seth
1
@MischaArefiev !=dans Coffee, qui se traduit par !==en JavaScript.
Suzana
14

Cette réponse concerne une ancienne version de coffeescript. Voir la réponse de Jaider ci - dessus si vous voulez une réponse plus à jour (à partir de juillet 2014)

Ce coffeescript fait ce que vous voulez, je pense:

if not MyVariable?
  MyVariable = "assign a value"

Ce qui produit:

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

Nb si vous faites une affectation en MyVariablepremier, même si vous définissez MyVariablesur undefined comme dans ce code , alors cela se compile en:

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

Je pense que cela fonctionne parce que celui !=utilisé par CoffeeScripts Existential Operator(le point d'interrogation) oblige undefinedà être égal ànull .

ps Pouvez-vous réellement vous rendre if (MyVariable?false){ ... }au travail? Il ne compile pas pour moi à moins qu'il n'y ait un espace entre l'opérateur existentiel et false, c'est-à-dire MyVariable? falseque CoffeeScript le vérifie comme une fonction à cause de falsece qu'il pense être un paramètre pour votre MyVariable, par exemple :

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"

Produit:

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
la source
3
c'est un vieux script de café. le variable?maintenant seulement compile à variable! = null
Gambai
@Gambai êtes-vous sûr? Le site Web affiche toujours ... !== null coffeescript.org/#try:variable%3F
AJP
1
Oui, le compilateur omet maintenant parfois le ! = Undefined comme optimisation parce que quand la variable doit être définie quelque part dans le code. Je dis devrait parce que le compilateur ne fonctionne pas toujours correctement ...
Suzana
@Suzana_K bon à savoir. Je suis sûr que les personnes qui rencontrent cette question aimeraient une réponse à jour, n'hésitez pas à modifier la mienne ou à publier une nouvelle réponse et je ferai un lien vers elle du haut de la mienne. Je n'utilise plus CoffeeScript après avoir adopté ES6 / TypeScript, donc je ne peux pas mettre à jour la réponse. En fait, il semble que la réponse de Jaider le couvre: stackoverflow.com/a/10238211/539490
AJP
11
typeof MyVariable isnt "undefined" 

de js2coffee

Jonathan
la source
9

En plus de la réponse de Jaider ci-dessus (je n'ai pas pu commenter en raison d'une réputation insuffisante) , faites attention que c'est un cas différent s'il s'agit de quelque chose à l'intérieur d'un objet / tableau:

someArray['key']?

sera converti en:

someArray['key'] != null

Capture d'écran de js2coffee.org :

js2coffee.org

LongYC
la source
Vous vérifiez si la clé existe, donc cela a du sens. Si vous avez également besoin de vérifier si le tableau existe, essayez someArray? ['Key']?
Joshua Davison le
6

J'utilise juste:

if (myVariable)
    //do stuff

Comme undefined est faux, il ne fera des choses que si myVariable n'est pas indéfini.

Vous devez juste être conscient qu'il fera des choses pour les valeurs 0, "" et nulles

Magrangs
la source
1
Je préfère cette méthode tant qu'elle myVariablen'est pas autorisée à être une valeur falsifiée comme nullou 0.
Bryan Downing
3

Le moyen le plus propre que j'ai trouvé pour affecter une variable à une variable non définie et non nulle consiste à utiliser unless:

unless ( myVar? )
    myVar = 'val'
tromper
la source
6
myVar ?= 'val'
Ricket
2

Pourquoi ne pas simplement utiliser l'idiome OR?

myVar or 'val'

Ainsi, le résultat sera égal à myVar, à moins qu'il ne soit indéfini auquel cas il sera égal à «val».

l3x
la source
3
Avec cet idiome, toute valeur fausse renverra «val» au lieu de ce qu'elle est censée être - y compris '', 0.0et false. Ce qui n'est probablement pas indésirable.
toriningen