2013-09-05 13 views
14

według serwisu coffeescriptkawa jeśli nie zdefiniowano

console.log(s) if s? 

powinien generować

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

Ale to, co jest wyświetlane w przeglądarce jest

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

Korzystanie parzenia kawy script-source (1.6.2), coffee-rails (3.2.2), rail-backbone (0.7.2), raile (3.2.13)

Oto moja funkcja skryptu do kawy. jakieś przemyślenia na temat tego, dlaczego nie dostaję tego, co na stronie z napisem do kawy mówi, że powinienem?

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

Interesujące. Ale potencjalnie poprawne. Czy 's' może być niezdefiniowane w twojej sytuacji? Jest zdefiniowany jako argument funkcji. – Thilo

+0

możliwy duplikat [CoffeeScript Undefined] (http://stackoverflow.com/questions/9929306/coffeescript-undefined) (tak naprawdę nie jest to pytanie, ale odpowiedzi i komentarze omawiają ten szczegół) – Thilo

Odpowiedz

31

Jeśli mówisz tylko goły:

console.log(s) if s? 

wtedy rzeczywiście uzyskać JavaScript nie zwariować (demo):

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

Jednak jeśli s jest znaną zmienną takich jak tutaj:

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

wtedy dostaniesz (demo):

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

dla testu s?.

Dlaczego więc różnica? W pierwszym przypadku, CoffeeScript nie może zagwarantować, że istnieje zmienna s w dowolnym miejscu, więc musi wykonać sprawdzanie w celu uniknięcia wyjątku ReferenceError.

Jednak jeśli s wiadomo istnieć, ponieważ jest to parametr funkcji lub został przypisany jako zmiennej lokalnej (tak, że coffeescript będzie produkować var s), wtedy nie trzeba czek typeof s ponieważ nie można, w takim przypadku uzyskaj ReferenceError.

Zostaje nam s !== null w stosunku do s != null. Spadek do nie ścisłej nierówności (s != null) pozwala sprawdzić, czy s jest undefined lub null z jednym porównaniem.Po sprawdzeniu typeof s !== "undefined" zawijacie test undefined przy pomocy "czy istnieje zmienna s", a dokładny test s !== null to wszystko, co należy sprawdzić pod kątem null.

+2

Według Javascript (Ecmascript) standardy 'undefined' i' null' są równe '==', więc 's == null' jest starym i dobrze ugruntowanym użyciem. Ale wiele norm lintowych sprzeciwia się użyciu '=='. Jest to jeden z problemów, które masz adres, jeśli skompilowany coffeescript musi być zatwierdzony do kłód. – hpaulj

+0

Ok .. Dzięki, nie ma problemu! :-) –

2

Masz rację,

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

console.log(x) if x? 

kompiluje do

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

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

Wygląda na to, że kompilator coffeescript jest optymalizacja kodu JavaScript trochę dla siebie, bo w przypadku połączenia Argument funkcji taki jak ten, typeof s nigdy nie będzie undefined jako s jest zdefiniowany tam w podpis funkcji, nawet jeśli jego wartość to null.

+0

tutaj jest przykład na żywo http://coffeescript.org/#try:(s)%20-%3E%20console.log(s)%20if%20s%3F%0A%0Aconsole.log(x)%20if%20x%3F – OzzyCzech

Powiązane problemy