2011-12-15 6 views
0

で数と不定/ヌル/ NaNの比較、結果は常にtrueあります。試験コード:は、ActionScriptの1及び2のActionScript

var x, n, range = 1000; 
for (var i = 0; i < 3; ++i) { 
    switch (i) { 
     case 0: 
      x = undefined; 
      break; 
     case 1: 
      x = null; 
      break; 
     case 2: 
      x = NaN; 
      break; 
    } 
    n = range*Math.random(); 
    trace(x + ' >= ' + n + ': ' + (x >= n)); 
    n = range*Math.random(); 
    trace(x + ' <= ' + n + ': ' + (x <= n)); 
} 

また、isNaN(null)リターンtrue

これらはJavaScriptとは異なり、ECMA規格に準拠していない可能性があります。

は、これらのバグまたは意図ていますか?

ありがとうございます!

+0

isNaN(null)は数字ではないのでtrueを返します...これらの他のコーナーケースに気付かなかったが、それらが「違法」であるか、操作の定義されていない結果としてよりよく説明されていることは、 。あなたは== NaNのようないくつかのことをするつもりはないので、isNaN()を使ってそれをテストする必要があります...私の推測では、演算子はASに例外を投げることができないので、 ActionScript内部のエキスパートとは遠く離れています... – Neoraptor

+0

意図的な場合、なぜ '<' or '>'演算子を使用すると結果が 'false'ですか? – ExpExc

+1

'>'または '<'の結果は常に 'undefined'でなければなりません - 私はそれをテストしました。私はあなたが「偽」を得ることができるか少し驚いています。 – weltraumpirat

答えて

2

のActionScript 2が一つだけの数値タイプ、番号を知っているので、あなたの比較ですべての非数値要素を数値にキャストされている - 書き込みと同じであろう:

Number (null) <= n 
Number (undefined) <= n 
Number (NaN) <= n 

Number ( {番号以外のもの} )は常にNaNを返します。したがって、すべてのステートメントは実際にはNaNで乱数を比較するだけです。 ActionScriptのドキュメントでは、NaNが比較可能ではないことを明確に警告し、常にisNaN()を使用してテストすることを推奨しています。

あなたはがNaNと比較しない場合は、しかし、それはAS2に奇妙なことである:

NaN == Number // returns false 
NaN != Number // returns true 

これらは期待どおりに動作しますが、:

NaN >= Number // returns true 
NaN <= Number // returns true 

し、最終的に:

NaN > Number // returns undefined 
NaN < Number // returns undefined 

もちろん、これはあまり直感的ではありません。 NaNは常にfalseでなければならず、それはAS 3で修正されていますが、nullは数字ではないので、isNaN(null) return trueになります。

+0

比較結果はバグですが、Adobeがなぜそれを修正しないのかわかりません。 'null'の場合、ActionScriptのようにJavaScriptが' NaN'ではなく '0'とみなす方法が気に入っています。 – ExpExc

+0

動作が意図されていない場合はバグがありません。 AS3では予測可能な動作をしています。 – weltraumpirat

+0

私は[Ming](http://www.libming.org)を使ってSWFファイルを生成していますが、 AS3はサポートしていません。 – ExpExc