2011-07-13 6 views
20

(1 < NaN)はなぜfalseで返され、undefined(JavaScriptではありません)ですか?なぜJavaScriptで(1 <NaN)falseですか?

"11.8.5抽象的な関係比較アルゴリズム"では、いずれかの値がNaN(私のビューでNaNに影響しないToPrimitiveとToNumberの後)の場合、結果はundefinedとなります。

私が手にFFとChromeでは

console.log(1 < NaN); 
// false 

それはなぜですか?

+4

+1質問のスペックを引用してください。 :-) – RobG

+3

Javascriptのfalse/NaN/0/undefined/""/nullの問題を間違いなく調べる必要があります。それはひどく矛盾しており、この(そうでなければかなり良い)言語の最も深刻な欠陥の一つです。 –

+0

@SF:もしそれが本当に厳しいのであれば、人々は*その代わり*に不平を言うでしょう。 :-)ルールは実際にそれほど悪くないわけではなく、実際にはこの特定の例はfalse/NaN/0/undefined/""/nullのものとは何の関係もありません。仕様にはリレーションがどのように動作するかを示すこのセクションがありますが、引用したセクションで作業を行ったことを他の場所で調べる必要があります。実際のオペレータの方が多くあります。 –

答えて

15

抽象的な関係アルゴリズムがundefinedを返すとき、<演算子がfalseを返すためです。生産関係式に

11.8.1小なり演算子(<

Section 11.8.1を参照してください、次のように関係式< ShiftExpressionが評価されています

  1. は LREF をしてみましょう評価の結果となるのはRelationalExpression
  2. lvalをGetValue(lref)とします。
  3. rrefShiftExpressionの評価結果とします。 (rref)。
  4. rは、抽象的な関係比較を実行した結果です。lval < rvalRを返し、未定義ある場合
  5. 11.8.5を参照してください)。それ以外の場合は、を返します。

これは、すべての関係演算子に当てはまります。 アルゴリズムundefinedの結果を持ちますが、演算子はそれをfalseに変換します。それは理にかなっています。 1は、< NaNではありません(> NaN、または== NaN、または... :-))。

(ニースはスペックを読んでいる人を見てください)

+0

セクション11.8.5:http://es5.github.com/#x11.8.5 –

+0

ああ!どうもありがとう! – Sacha

関連する問題