web-dev-qa-db-fra.com

CoffeeScript non défini

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 cela dans coffeescript? ... j'essaie quelque chose comme

if (MyVariable?false){ ... }

mais cette vérification si MyVariable est une fonction si donc cela appellera MyVariable (false) sinon, cela appellera void (0) ou quelque chose comme ça.

89
Jaider

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

if (MyVariable?){ ... }

cela va générer:

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

UPDATE 04/07/2014 lien de démonstration

enter image description here

163
Jaider

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 indéfini et faux (par exemple, si myVariable peut être vrai, faux ou indéfini).

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

Le mot-clé then peut être utilisé si tout se trouve 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!

26
soundslikeneon

Cette réponse concerne une version plus ancienne de coffeescript. Voir réponse de Jaider ci-dessus si vous souhaitez 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"

Qui produit:

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

N.b. si vous faites d'abord une affectation à MyVariable, même si vous définissez MyVariable sur non défini comme dans ce code , alors ceci est compilé en:

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

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

p.s. Pouvez-vous réellement faire fonctionner if (MyVariable?false){ ... }? Il ne compile pour moi que s'il existe un espace entre l'opérateur existentiel et false, à savoir MyVariable? false, Ce qui permet à CoffeeScript de le vérifier comme une fonction à cause du false qui, selon lui, est un paramètre de 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");
}
14
AJP
typeof MyVariable isnt "undefined" 

de js2coffee

11
Jonathan

En plus de réponse de Jaider ci-dessus (je ne pouvais pas commenter pour des raisons de réputation insuffisante) , veillez à ce que ce soit un cas différent. si c'est 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

9
LongYC

Je viens d'utiliser:

if (myVariable)
    //do stuff

Comme indéfini est faux, cela ne fonctionnera que si myVariable n'est pas indéfini.

Vous devez juste être conscient qu'il va "faire des choses" pour les valeurs qui sont 0, "" et null

6
Magrangs

La méthode la plus propre que j'ai trouvée pour affecter une variable à une variable non définie et non nulle consiste à utiliser unless:

unless ( myVar? )
    myVar = 'val'
3
fooling

Pourquoi ne pas simplement utiliser l'idiome OR?

myVar or 'val'

Ainsi, le résultat sera égal à myVar, sauf s'il est indéfini, auquel cas il sera égal à 'val'.

2
l3x