2012-04-03 3 views
11

私はCoffeeScriptコンパイル者にちょっと奇妙なことに気付き、これが正しい動作かどうか疑問に思っていました。それが正しい場合差がある理由は、私は好奇心が強い。..CoffeeScript Existential Operator and this

次のCoffeeScriptを考える:

if @myVar? 
    alert myVar 

私はこのようなJavaScriptにコンパイルすることを期待していた。

if (typeof this.myVar !== "undefined" && this.myVar !== null) { 
    alert(myVar); 
} 

しかし、代わりにCoffeeScriptコンパイラが出力するものは次のとおりです。

if (this.myVar != null) { 
    alert(myVar); 
} 

これを参照していないまたは他の親オブジェクト)、私が期待するようにCoffeeScriptがコンパイルされます。

これは正しい動作ですか?もしそうなら、これを使うときにはなぜ違うのですか?

編集:

もう少し説明を追加してください。これは、これだけではなく、他のオブジェクトのプロパティでも発生します。ことができます

myVar = 10 
if myVar? 
    alert myVar 

のCoffeeScriptのコンパイラ:「!= nullの」たとえば、私がいた場合のケースで...まだだけでコンパイルします

if myVar.myProp? 
    alert myVar 
+2

可能重複していますプロパティ](http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties) –

答えて

14

をその下に何があるかと上記のCoffeeScriptを置き換えますmyVarが実際に最初の行に定義されていることを確認すると、typeof myVar !== "undefined"のチェックを省略できます。

if myVar? 
    alert myVar 

コンパイラが実際に定義されてmyVarので、余分なチェックが必要であることを保証することはできません:

if (typeof myVar !== "undefined" && myVar !== null) { 
    alert(myVar); 
} 

だから、答えは次のとおりです。

if (myVar !== null) { 
    alert(myVar); 
} 

しかし、この場合には

のCoffeeScriptコンパイラは効率的なコードを生成するためにスマートにしようとします。

EDIT 性質を持つのCoffeeScriptのお得な情報も正しい方法:プロパティが定義されていない場合this.propundefined戻ります。 !=はnullに変換されます。だから我々は追加のチェックを必要としないのです。いくつかの単語で
:未定義の変数にアクセスする

  • が例外をスロー - 未定義のプロパティにアクセスするtypeof
  • をチェックする必要がundefinedを返します - ちょうど!=は[実存オペレータとオブジェクトの十分な
+0

私はそれを理解しています。私の質問は、オブジェクトthis.var、またはthat.var.property ..などのプロパティの存在をチェックすることとさらに関係がありました。未定義チェックを省略し、!== nullの代わりに!= nullだけを行います.. 。 –

+0

私は今理解しています。私はこれをCoffeeScriptコンパイラの理解が不足しているところまでチョークしなければなりません:)これらの「決定」を行うにはそれが十分にスマートであることは本当にわかりませんでした。しかし、それは本当に知って良いです。洞察のためにありがとう! –