2013-09-05 13 views
14

を定義されていない場合コーヒースクリプトのテストには、コーヒースクリプトサイト</p> <pre><code>console.log(s) if s? </code></pre> <p>に応じ

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

を生成しかし、どのような私のブラウザにアップ見せていること

coffee-を使用して
if (s != null) { 
     return console.log(s); 
    } 

である必要がありますスクリプトソース(1.6.2)、コーヒーレール(3.2.2)、レールバックボーン(0.7.2)、レール(3.2.13)

ここに私のコーヒースクリプト機能があります。なぜ私はコーヒースクリプトのサイトが私がすべきと言っているものを得ていないのですか?

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

興味深い。しかし、潜在的に正しい。あなたの状況では 's'は未定義ですか?それは関数の引数として定義されます。 [コーヒースクリプト未定]の複製可能な – Thilo

+0

(http://stackoverflow.com/questions/9929306/coffeescript-undefined)(実際の質問ではありませんが、回答とコメントで詳細を説明しています) – Thilo

答えて

31

あなただけの裸を言う場合:

console.log(s) if s? 

、あなたは確かにあなたが(demoを)期待しているJavaScriptを取得します:

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

しかし、sのような知られた変数である場合には、ここ:

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

あなたは(demo)を取得します。

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

s?試験の場合。

なぜ違いはありますか?最初のケースでは、CoffeeScriptはs変数が存在することを保証することができないため、ReferenceErrorの例外を避けるためにtypeof sチェックを行う必要があります。

それが関数のパラメータであるか(のCoffeeScriptはvar sを生成するように)ローカル変数として割り当てられているので、sが存在することが知られている場合は、あなたはtypeof sチェックあなたがすることができないので必要ありません、この場合はReferenceErrorになります。

この結果、s !== nulls != nullがあります。非厳密な不等式(s != null)に下がると、sundefinedまたはnullであるかどうかを一度比較することができます。typeof s !== "undefined"にチェックを入れると、undefinedテストで "s変数がある"チェックと厳密なs !== nullテストの両方がnullであることを確認する必要があります。

+2

Javascript(Ecmascript)による'undefined'と' null'は '=='と等しいので、 's == null'は古い使い方です。しかし、多くの標準規格は '=='の使用に反対しています。コンパイルされたcoffeescriptがリント承認を受けなければならない場合は、あなたが対処している問題の1つです。 – hpaulj

+0

Ok ..問題ありません! :-) –

2

そうだね、

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

console.log(x) if x? 

はCoffeeScriptのコンパイラがあるため、Aの場合には、Javascriptをあなたのために少し最適化されたように見えます

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

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

にコンパイルこのような関数の引数であるtypeof sは、undefinedとなることはありません。つまり、その値がであっても、関数シグネチャにはsが正しく定義されています。

+0

ここにライブの例があります http:///coffeescript.org/#try:(s)%20-%3E%20console.log(s)%20if%20s%3F%0A%0Aconsole.log(x)%20if%20x%3F – OzzyCzech

関連する問題