CoffeeScript Undefined

89

Em javascript para verificar se uma variável nunca foi criada, basta fazer

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

Fiquei me perguntando como faço isso em coffeescript? ... Tento algo como

if (MyVariable?false){ ... }

mas esta verifica se MyVariableé uma função que chamará MyVariable (false) se não chamar void (0) ou algo parecido.

Jaider
fonte
Experimente o if MyVariable isnt undefinedque produz if (MyVariable !== void 0).
Yami Odymel

Respostas:

163

Finalmente descobri esta maneira fácil de fazer isso:

if (MyVariable?){ ... }

isso irá gerar:

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

ATUALIZAÇÃO 07/04/2014 Link de demonstração

insira a descrição da imagem aqui

Jaider
fonte
58
Na verdade, ele apenas gerouitem != null
Pencilcheck
13
@Pencilcheck - isso ocorre porque o compilador determinou que o item foi definido em seu código. (também, ótimo nome - embora agora seja um tablet, verifique para mim :) Essa resposta também pega valores nulos, que são muito diferentes de indefinidos. Parece uma resposta a uma pergunta diferente IMHO
Seth
3
@ Set, sim, fico queimado com essa nuance o tempo todo, o que levanta a próxima questão lógica: o CS oferece algum atalho sintático para o seguinte: MyVariable = MyMethod; if MyVariable? ... onde MyMethod pode retornar undefined? Ou então você deve recorrer a if typeof myVariable isnt 'undefined'?
neverfox de
1
@neverfox o último, tanto quanto eu sei (verificação de tipo indefinido) - CoffeeScript pensa que nulo e indefinido devem ser confundidos.
Seth
6
@ Set, não realmente. As comparações não estritas ( ==e !=) realmente tratam nulle undefinedcomo valores iguais, portanto, item != nulltestam de fato nulle undefinedao mesmo tempo. Não, se estiver escrito como item !== null.
toriningen
26

Primeiro, para responder à sua pergunta:

if typeof myVariable isnt 'undefined' then # do stuff

A solução de Magrangs funcionará na maioria dos casos, exceto quando você precisar distinguir entre undefined e false (por exemplo, se myVariable pode ser true, false ou undefined).

E só para ressaltar, você não deve envolver suas condições entre parênteses e não deve usar chaves.

A thenpalavra-chave pode ser usada se tudo estiver na mesma linha, caso contrário, use indentação para indicar qual código está dentro da condição.

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

Espero que isto ajude!

sonslikeneon
fonte
A isntpalavra-chave é equivalente a !=em Coffeescript e pode ser mais legível se você estiver acostumado com javascript.
Aaron Dufour
12
Equivalente a !==, não!=
Mischa Arefiev
1
Esta é a resposta mais específica - muitas das outras também interagem com valores nulos. Thx
Seth
1
@MischaArefiev !=em Coffee, que se traduz !==em JavaScript.
Suzana
14

Esta resposta é para uma versão mais antiga do coffeescript. Veja a resposta de Jaider acima se quiser uma resposta mais atualizada (em julho de 2014)

Este coffeescript faz o que você quer, eu acho:

if not MyVariable?
  MyVariable = "assign a value"

Que produz:

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

Nb se você fizer uma atribuição para MyVariableprimeiro, mesmo se você definir MyVariablecomo indefinido como neste código , então ele compila para:

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

Eu acredito que isso funciona porque o !=usado por CoffeeScripts Existential Operator(o ponto de interrogação) coage undefineda ser igual anull .

ps Você pode realmente começar if (MyVariable?false){ ... }a trabalhar? Ele não compila para mim a menos que haja um espaço entre o operador existencial e falso, ou seja, o MyVariable? falseque faz o CoffeeScript verificá-lo como uma função por causa do falseque ele pensa ser um parâmetro para o seu MyVariable, por exemplo :

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"

Produz:

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
fonte
3
esta é a velha escrita do café. o variable?agora só compila para a variável! = null
Gambai
@Gambai tem certeza? O site ainda mostra ... !== null coffeescript.org/#try:variable%3F
AJP
1
Sim, o compilador agora às vezes omite o ! = Undefined como uma otimização porque quando a variável deve ser definida em algum lugar do código. Digo deveria porque o compilador nem sempre funciona corretamente ...
Suzana
@Suzana_K bom saber. Tenho certeza de que as pessoas que encontrarem esta pergunta gostariam de uma resposta atualizada, sinta-se à vontade para editar a minha ou postar uma nova resposta e eu irei criar um link para ela no topo da minha. Não uso mais o CoffeeScript depois de adotar o ES6 / TypeScript, então não posso atualizar a resposta. Na verdade, parece que a resposta de Jaider cobre isso: stackoverflow.com/a/10238211/539490
AJP
11
typeof MyVariable isnt "undefined" 

de js2coffee

Jonathan
fonte
9

Além da resposta de Jaider acima (não pude comentar devido à reputação insuficiente) , tome cuidado para que seja um caso diferente se for algo dentro de um objeto / array:

someArray['key']?

será convertido para:

someArray['key'] != null

Captura de tela de js2coffee.org :

js2coffee.org

LongYC
fonte
Você está verificando se a chave existe, então isso faz sentido. Se você também precisar verificar se a matriz existe, tente someArray? ['Chave']?
Joshua Davison
6

Eu só uso:

if (myVariable)
    //do stuff

Como undefined é falso, ele só fará as coisas se myVariable não for undefined.

Você apenas deve estar ciente de que ele 'fará coisas' para valores que são 0, "" e nulos

Magrangs
fonte
1
Prefiro esse método, desde que myVariablenão seja permitido ter um valor falso como nullou 0.
Bryan Downing
3

A maneira mais limpa que encontrei de atribuir uma variável a uma variável indefinida e não nula é usando unless:

unless ( myVar? )
    myVar = 'val'
enganar
fonte
6
myVar ?= 'val'
Ricket
2

Por que não usar apenas o idioma OR?

myVar or 'val'

Portanto, o resultado será igual a myVar, a menos que seja indefinido, caso em que será igual a 'val'.

13x
fonte
3
Com este idioma, qualquer valor falso retornará 'val' em vez de qualquer coisa que seja - incluindo '', 0.0e false. O que provavelmente não é indesejado.
toriningen