2011-12-15 54 views
0

比較未定義/空/南帶着數在ActionScript 1和2,如果你比較undefinednullNaN使用>=<=運營商的任意數,結果總是true。測試代碼:在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(空)應返回true,因爲它不是一個數量......沒有注意到這些極端情況,但作爲那些是「非法」或更好,因爲操作的不確定的結果解釋,我比較肯定是故意的。你不應該做一些像NaN那樣的事情,所以你必須使用isNaN()來測試這個......我猜測運營商不能在AS中拋出異常,所以他們不得不訴諸於我,但是我「從專家米遠上的ActionScript內部... – Neoraptor 2011-12-15 10:00:02

+0

如果是故意的,爲什麼用``<` or `>操作時,結果是'FALSE`? – ExpExc 2011-12-15 10:19:28

回答

2

由於ActionScript 2的只知道一個數值類型,數量,所有非數值在比較元素轉換爲數量 - 這將是相同的文字:

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

Number ( {任何東西,但數} )總是返回NaN,因此您的所有語句只會將隨機數與NaN進行比較。 ActionScript文檔清楚地警告NaN不具有可比性,並建議始終使用isNaN()進行測試。

如果與南相比較,但是,它是在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應該總是假的,並且已經在AS3中修復 - 但是絕對有意義的是,null不是一個數字,因此isNaN(null)應該返回true