CoffeeScript indefinido

89

En javascript para verificar si nunca se creó una variable, simplemente lo hacemos

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

Me preguntaba cómo hago eso en coffeescript ... Intento algo como

if (MyVariable?false){ ... }

pero esta verificación si MyVariablees una función, si es así, llamará a MyVariable (falso) si no, llamará a void (0) o algo así.

Jaider
fuente
Véase también coffeescript not null o undefined
Bergi
Prueba if MyVariable isnt undefinedcuál produce if (MyVariable !== void 0).
Yami Odymel

Respuestas:

163

Finalmente encontré esta manera fácil de hacerlo:

if (MyVariable?){ ... }

que generará:

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

ACTUALIZACIÓN 07/04/2014 Enlace de demostración

ingrese la descripción de la imagen aquí

Jaider
fuente
58
En realidad, solo generóitem != null
Pencilcheck
13
@Pencilcheck: eso se debe a que el compilador determinó que el elemento se definió en su código. (también, gran nombre, aunque ahora es una verificación de tableta para mí :) Esta respuesta también recoge valores nulos que son muy diferentes de los indefinidos. Parece una respuesta a una pregunta diferente en mi humilde opinión
Seth
3
@Seth, sí, ese matiz me quema todo el tiempo, lo que plantea la siguiente pregunta lógica: ¿CS ofrece algún atajo sintáctico para lo siguiente: MyVariable = MyMethod; if MyVariable? ... donde MyMethod podría regresar undefined? ¿O entonces debes recurrir a if typeof myVariable isnt 'undefined'?
neverfox
1
@neverfox, lo último que yo sepa (verificación de tipo indefinido): CoffeeScript cree que nulo e indefinido deben combinarse.
Seth
6
@Seth, en realidad no. Las comparaciones no estrictas ( ==y !=) en realidad tratan nully undefinedcomo valores iguales, por lo que en item != nullrealidad prueban tanto para nully undefinedal mismo tiempo. No es así, si está escrito como item !== null.
Toriningen
26

Primero, para responder a su pregunta:

if typeof myVariable isnt 'undefined' then # do stuff

La solución de Magrangs funcionará en la mayoría de los casos, excepto cuando necesite distinguir entre indefinido y falso (por ejemplo, si myVariable puede ser verdadero, falso o indefinido).

Y solo para señalar, no debe envolver sus condiciones entre paréntesis, y no debe usar llaves.

La thenpalabra clave se puede usar si todo está en la misma línea; de lo contrario, use sangría para indicar qué código está dentro de la condición.

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

¡Espero que esto ayude!

suena como neón
fuente
La isntpalabra clave es equivalente a !=en Coffeescript y puede ser más legible si está acostumbrado a JavaScript.
Aaron Dufour
12
Equivalente a !==, no!=
Mischa Arefiev
1
Esta es la respuesta más específica; muchas de las otras también interactúan con valores nulos. Thx
Seth
1
@MischaArefiev !=en Coffee, que se traduce !==en JavaScript.
Suzana
14

Esta respuesta es para una versión anterior de coffeescript. Consulte la respuesta de Jaider anterior si desea una respuesta más actualizada (a partir de julio de 2014)

Este coffeescript hace lo que quieres, creo:

if not MyVariable?
  MyVariable = "assign a value"

Que produce:

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

Nb, si realiza una asignación a MyVariableprimero, incluso si lo establece MyVariablecomo indefinido como en este código , entonces esto se compila en:

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

Creo que esto funciona porque el !=utilizado por CoffeeScripts Existential Operator(el signo de interrogación) obliga undefineda ser igual anull .

ps ¿Puedes realmente ir if (MyVariable?false){ ... }a trabajar? No se compila para mí a menos que haya un espacio entre el operador existencial y falso, es decir, lo MyVariable? falseque hace que CoffeeScript lo verifique como una función debido a falseque cree que es un parámetro para usted MyVariable, por ejemplo :

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"

Produce:

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
fuente
3
este es el antiguo guión de café. el variable?ahora solo se compila en la variable! = null
Gambai
@Gambai, ¿estás seguro? El sitio web todavía muestra ... !== null coffeescript.org/#try:variable%3F
AJP
1
Sí, el compilador ahora a veces omite ! = Undefined como optimización porque cuando la variable debería definirse en algún lugar del código. Digo debería porque el compilador no siempre funciona correctamente ...
Suzana
@Suzana_K es bueno saberlo. Estoy seguro de que a las personas que se encuentren con esta pregunta les gustaría una respuesta actualizada, no dude en editar la mía o publicar una nueva respuesta y la vincularé desde la parte superior de la mía. Ya no uso CoffeeScript después de adoptar ES6 / TypeScript, por lo que no puedo actualizar la respuesta. En realidad, parece que la respuesta de Jaider lo cubre: stackoverflow.com/a/10238211/539490
AJP
9

Además de la respuesta de Jaider anterior (no pude comentar debido a una reputación insuficiente) , tenga cuidado de que sea un caso diferente si es algo dentro de un objeto / matriz:

someArray['key']?

se convertirá a:

someArray['key'] != null

Captura de pantalla de js2coffee.org :

js2coffee.org

LongYC
fuente
Estás comprobando si existe la clave, así que esto tiene sentido. Si también necesita comprobar si la matriz existe, pruebe someArray? ['Key']?
Joshua Davison
6

Yo solo uso:

if (myVariable)
    //do stuff

Como indefinido es falso, solo hará cosas si myVariable no está indefinido.

Solo debe tener en cuenta que "hará cosas" para los valores que sean 0, "" y nulos.

Magrangs
fuente
1
Prefiero este método siempre que myVariableno se permita que sea un valor falso como nullo 0.
Bryan Downing
3

La forma más limpia que he encontrado para asignar una variable a una variable indefinida y no nula es usando unless:

unless ( myVar? )
    myVar = 'val'
engañando
fuente
6
myVar ?= 'val'
Ricket
2

¿Por qué no usar el modismo OR?

myVar or 'val'

Por lo tanto, el resultado será igual a myVar, a menos que no esté definido, en cuyo caso será igual a 'val'.

l3x
fuente
3
Con este modismo, cualquier valor falso devolverá 'val' en lugar de lo que se supone que es, incluidos '', 0.0y false. Lo cual, probablemente, no sea indeseado.
Toriningen