CoffeeScript Undefined


89

In javascript per verificare se una variabile non è mai stata creata, lo facciamo e basta

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

Mi chiedevo come faccio a farlo in coffeescript? ... Provo qualcosa di simile

if (MyVariable?false){ ... }

ma questo controllo se MyVariableè una funzione, in tal caso chiamerà MyVariable (false) altrimenti chiamerà void (0) o qualcosa del genere.



Prova if MyVariable isnt undefinedquale produce if (MyVariable !== void 0).
Yami Odymel

Risposte:


163

Finalmente ho trovato questo modo semplice per farlo:

if (MyVariable?){ ... }

che genererà:

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

AGGIORNAMENTO 04/07/2014 Link Demo

inserisci qui la descrizione dell'immagine


58
In realtà ha generato soloitem != null
Pencilcheck

13
@Pencilcheck - questo perché il compilatore ha determinato che l'elemento è stato definito nel codice. (anche, ottimo nome - anche se ora è il controllo del tablet per me :) Questa risposta raccoglie anche valori nulli che sono molto diversi da undefined. Sembra una risposta a una domanda diversa IMHO
Seth

3
@Seth, sì, sono sempre bruciato da quella sfumatura, il che solleva la domanda logica successiva: CS offre scorciatoie sintattiche per quanto segue: MyVariable = MyMethod; if MyVariable? ... dove MyMethod potrebbe tornare undefined? O devi quindi ricorrere if typeof myVariable isnt 'undefined'?
neverfox

1
@neverfox quest'ultimo per quanto ne so (controllo del tipo undefined) - CoffeeScript pensa che null e undefined dovrebbero essere combinati.
Seth

6
@Seth, non proprio. Confronti non rigorosi ( ==e !=) trattano effettivamente nulle undefinedcome valori uguali, quindi item != nullverifica effettivamente sia per nullche undefinedallo stesso tempo. Non lo fa, se è scritto come item !== null.
toriningen

26

Innanzitutto, per rispondere alla tua domanda:

if typeof myVariable isnt 'undefined' then # do stuff

La soluzione di Magrangs funzionerà nella maggior parte dei casi, tranne quando è necessario distinguere tra undefined e false (ad esempio, se myVariable può essere true, false o undefined).

E solo per sottolineare, non dovresti racchiudere le tue condizioni tra parentesi e non dovresti usare le parentesi graffe.

La thenparola chiave può essere utilizzata se tutto è sulla stessa riga, altrimenti usa l'indentazione per indicare quale codice si trova all'interno della condizione.

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

Spero che questo ti aiuti!


La isntparola chiave è equivalente a !=in Coffeescript e potrebbe essere più leggibile se sei abituato a javascript.
Aaron Dufour

12
Equivalente a !==, non!=
Mischa Arefiev

1
Questa è la risposta più specifica: molti degli altri interagiscono anche con valori nulli. Thx
Seth

1
@MischaArefiev !=in Coffee, che si traduce !==in JavaScript.
Suzana,

14

Questa risposta è per una versione precedente di coffeescript. Vedi la risposta di Jaider sopra se vuoi una risposta più aggiornata (a partire da luglio 2014)

Questo coffeescript fa quello che vuoi, penso:

if not MyVariable?
  MyVariable = "assign a value"

Che produce:

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

Nb se si assegna MyVariableprima a, anche se si imposta MyVariablesu undefined come in questo codice , allora si compila in:

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

Credo che funzioni perché quello !=usato da CoffeeScripts Existential Operator(il punto interrogativo) costringe undefinedad essere uguale a null.

ps Puoi davvero metterti if (MyVariable?false){ ... }al lavoro? Non si compila per me a meno che non ci sia uno spazio tra l'operatore esistenziale e false, vale a dire MyVariable? falseche quindi CoffeeScript lo controlla come una funzione a causa della falsequale ritiene che sia un parametro per il tuo MyVariable, ad esempio :

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");
}

3
questo è il vecchio copione del caffè. l' variable?compila ora solo alla variabile = null!
Gambai

@Gambai sei sicuro? Il sito web mostra ancora ... !== null coffeescript.org/#try:variable%3F
AJP

1
Sì, il compilatore ora a volte omette ! = Undefined come ottimizzazione perché quando la variabile dovrebbe essere definita da qualche parte nel codice. Dico dovrebbe perché il compilatore non funziona sempre correttamente ...
Suzana

@Suzana_K buono a sapersi. Sono sicuro che le persone che si imbattono in questa domanda vorrebbero una risposta aggiornata, sentiti libero di modificare la mia o pubblicare una nuova risposta e io ti collegherò ad essa dall'alto della mia. Non uso più CoffeeScript dopo aver adottato ES6 / TypeScript, quindi non posso aggiornare la risposta. In realtà sembra che la risposta di Jaider lo copra: stackoverflow.com/a/10238211/539490
AJP


9

Oltre alla risposta di Jaider sopra (non ho potuto commentare a causa della reputazione insufficiente) , fai attenzione che sia un caso diverso se si tratta di qualcosa all'interno di un oggetto / array:

someArray['key']?

sarà convertito in:

someArray['key'] != null

Screenshot da js2coffee.org :

js2coffee.org


Stai controllando se la chiave esiste, quindi ha senso. Se hai anche bisogno di controllare se l'array esiste, prova someArray? ['Key']?
Joshua Davison,

6

Uso solo:

if (myVariable)
    //do stuff

Poiché undefined è falso, funzionerà solo se myVariable non è undefined.

Devi solo essere consapevole che "farà cose" per valori che sono 0, "" e null


1
Preferisco questo metodo fintanto che myVariablenon è consentito essere un valore falso come nullo 0.
Bryan Downing

3

Il modo più pulito che ho trovato per assegnare una variabile a una variabile non definita e non nulla è usare unless:

unless ( myVar? )
    myVar = 'val'

6
myVar ?= 'val'
Ricket

2

Perché non usare semplicemente l'idioma OR?

myVar or 'val'

Quindi, il risultato sarà uguale a myVar, a meno che non sia indefinito, nel qual caso sarà uguale a "val".


3
Con questo idioma qualsiasi valore falso restituirà 'val' invece di qualunque cosa dovrebbe essere - inclusi '', 0.0e false. Il che, probabilmente, non è indesiderato.
toriningen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.