2013-09-05 19 views
14

secondo il sito script di caffècaffè test script se non definito

console.log(s) if s? 

dovrebbe generare

if (typeof s !== "undefined" && s !== null) { 
    console.log(s); 
} 

Ma ciò che sta mostrando nel mio browser è

if (s != null) { 
     return console.log(s); 
    } 

Utilizzando caffè- script-source (1.6.2), coffee-rails (3.2.2), rails-backbone (0.7.2), rails (3.2.13)

Ecco la mia funzione di script caffè. Qualche idea sul perché non sto ottenendo quello che il sito di sceneggiatura di caffè dice che dovrei ??

window.p = (s) -> 
    console.log(s) if s? 
+0

Interessante. Ma potenzialmente corretto. 'S' non è definito nella tua situazione? È definito come un argomento di funzione. – Thilo

+0

possibile duplicato di [CoffeeScript Undefined] (http://stackoverflow.com/questions/9929306/coffeescript-undefined) (non proprio la domanda, ma le risposte e i commenti trattano questo dettaglio) – Thilo

risposta

31

se dici solo un nudo:

console.log(s) if s? 

allora sarete davvero ottenere il JavaScript vi aspettate (demo):

if (typeof s !== "undefined" && s !== null) { 
    console.log(s); 
} 

Tuttavia, se s è una variabile conosciuta come qui:

f = (s) -> console.log(s) if s? 

allora avrai (demo):

if (s != null) { 
    //... 
} 

per il test s?.

Quindi perché la differenza? Nel primo caso, CoffeeScript non è in grado di garantire che esista una variabile s esistente, pertanto deve eseguire un controllo typeof s per evitare un'eccezione ReferenceError.

Tuttavia, se s si sa di esistere perché si tratta di un parametro di funzione o è stato assegnato a come una variabile locale (in modo che CoffeeScript produrrà un var s), allora non è necessario il controllo typeof s dal momento che non è possibile, in questo caso, prendi un ReferenceError.

Questo ci lascia con s !== null versus s != null. L'eliminazione della disuguaglianza non rigorosa (s != null) consente di verificare se s è undefined o null con un unico confronto.Quando si seleziona, si esegue il wrapping del test undefined con "c'è un controllo s variabile" e un test s !== null rigoroso è tutto ciò che è necessario verificare per null.

+2

Da Javascript (Ecmascript) standard 'undefined' e' null' sono '==' uguali, quindi 's == null' è un uso vecchio e ben consolidato. Ma molti standard di filaccia si oppongono all'uso di '=='. È uno dei problemi che hai affrontato se il coffeescript compilato deve essere approvato. – hpaulj

+0

Ok .. Grazie nessun problema! :-) –

2

Hai ragione,

(s) -> console.log(s) if s? 

console.log(x) if x? 

compila per

(function(s) { 
    if (s != null) { 
    return console.log(s); 
    } 
}); 

if (typeof x !== "undefined" && x !== null) { 
    console.log(x); 
} 

Sembra che il compilatore CoffeeScript sta ottimizzando il Javascript un po 'per voi, perché nel caso di un l'argomento della funzione come questo, non sarà mai undefined come s è definito proprio lì nella firma della funzione, anche se il suo valore è null.

+0

qui è l'esempio dal vivo http://coffeescript.org/#try:(s)%20-%3E%20console.log(s)%20if%20s%3F%0A%0Aconsole.log(x)%20if%20x%3F – OzzyCzech

Problemi correlati