Die Dokumentation sagt über ?
:
Coffeeexistenz Operator ?
true zurück, es sei denn, eine Variable null oder undefined ist, die es analog macht Rubys nil?
so von Natürlich wird dies "Kein Taco!" sagen:
taco = undefined
if taco?
console.log "fiesta!"
else
console.log "No taco!"
Ihre taco
ist explizit undefined
also taco?
ist falsch.
CoffeeScript deklariert implizit Variablen, sodass das JavaScript-Formular ?
kontextabhängig ist. dieses Beispiel: Wenn Sie nur sagen, nur:
if taco?
console.log "fiesta!"
else
console.log "No taco!"
Sie werden sehen, dass taco?
typeof taco !== "undefined" && taco !== null
wird. Sie sehen immer noch die "Ist es null
" überprüfen (in einer engeren Form), aber es gibt auch die "Ist es ein var taco
" mit typeof
überprüfen; Beachten Sie, dass der typeof taco
Test auch auf taco = undefined
prüft, so dass ein strengerer !==
Test verwendet werden kann, um zu sehen, ob taco
null
ist.
Sie sagen, das ist:
Ich bemerkte, dass meine Version von Coffeescript wurde nur kompilieren, dies zu something !== null
aber das ist nicht das, was es tut, ist es tatsächlich kompilieren zu something != null
; Beachten Sie die Verwendung der "schlampigen" Conversion-Ungleichung (!=
) gegenüber der strikten Ungleichheit (!==
), die Sie behaupten, dass sie da ist.Der Unterschied zwischen !=
und !==
ist wichtig, hier since:
- Null und Nicht definierte Typen sind
==
(aber nicht ===
)
Also, wenn Sie wissen, dass variable v
erklärt worden ist (dh es gibt var v
irgendwo) dann v != null
ist ausreichend, um zu überprüfen, dass v
ist weder null
noch undefined
. Wenn Sie jedoch nicht wissen, dass v
deklariert wurde, benötigen Sie eine typeof
-Prüfung, um ein ReferenceError zu vermeiden, wenn Sie versuchen, eine nicht deklarierte Variable mit null
zu vergleichen. Betrachten Sie diese JavaScript:
if(taco != null) {
console.log("fiesta!");
} else {
console.log("No taco!");
}
dass ein Reference in dein Gesicht, da taco
werfen nicht existiert. Dies:
if(typeof taco !== "undefined" && taco !== null)
console.log("fiesta!");
} else {
console.log("No taco!");
}
auf der anderen Seite ist da die typeof
Check Wachen Bußgeld gegen versuchen, etwas zu greifen, die nicht erklärt hat. Ich denke nicht, dass Sie das erste in CoffeeScript erstellen können, ohne JavaScript mit Backticks einzubetten.
Keine exakte Frage duplizieren, aber die Antwort ist die gleiche: http://StackOverflow.com/Questions/9990117/existential-Operator-and-Object-Properties: D – epidemian