2013-06-22 9 views
5

Coffee den existentiellen Operator verwendet, um zu bestimmen, wenn eine Variable existiert und in den coffeescript documentation zeigt es, dass something? zu something !== undefined && something !== null kompilieren würde aber ich, dass meine Version von Coffee bemerkte nur das Kompilieren zu something !== null so wurde schrieb ich einen Test würde dies zu sehen, wie bewirken meinen CodeWie funktioniert der existentielle Operator von CoffeeScript?

taco = undefined 

if taco? 
    console.log "fiesta!" 
else 
    console.log "No taco!" 

die

// Generated by CoffeeScript 1.4.0 
(function() { 
    var taco; 

    taco = void 0; 

    if (taco != null) { 
    console.log("fiesta!"); 
    } else { 
    console.log("No taco!"); 
    } 

}).call(this); 

zu zusammengestellt und ausgegeben die etwas unerwartet No taco! so meine Frage zweifach ist. Warum prüft coffeescript nicht mehr, ob der Wert undefined ist und warum ist das so?

+0

Keine exakte Frage duplizieren, aber die Antwort ist die gleiche: http://StackOverflow.com/Questions/9990117/existential-Operator-and-Object-Properties: D – epidemian

Antwort

21

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 taconull 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.

+1

Große Antwort. Ich wünschte, die Frage wäre mit "In CoffeeScript, wie funktioniert der existentielle Operator?" So war deine Antwort leichter zu finden. Stattdessen muss ich die Frage favorisieren, damit ich diese wieder finde. –

+3

Ich habe mich geärgert, sobald ich "No taco!" - Das war amüsant. – jcollum

Verwandte Themen