(1 < NaN)
はなぜfalse
で返され、undefined
(JavaScriptではありません)ですか?なぜJavaScriptで(1 <NaN)falseですか?
"11.8.5抽象的な関係比較アルゴリズム"では、いずれかの値がNaN(私のビューでNaNに影響しないToPrimitiveとToNumberの後)の場合、結果はundefined
となります。
:
console.log(1 < NaN);
// false
それはなぜですか?
(1 < NaN)
はなぜfalse
で返され、undefined
(JavaScriptではありません)ですか?なぜJavaScriptで(1 <NaN)falseですか?
"11.8.5抽象的な関係比較アルゴリズム"では、いずれかの値がNaN(私のビューでNaNに影響しないToPrimitiveとToNumberの後)の場合、結果はundefined
となります。
:
console.log(1 < NaN);
// false
それはなぜですか?
抽象的な関係アルゴリズムがundefined
を返すとき、<
演算子がfalse
を返すためです。生産関係式に
11.8.1小なり演算子(
<
):Section 11.8.1を参照してください、次のように関係式< ShiftExpressionが評価されています
- は LREF をしてみましょう評価の結果となるのはRelationalExpression。
- lvalをGetValue(lref)とします。
- rrefをShiftExpressionの評価結果とします。 (rref)。
- rは、抽象的な関係比較を実行した結果です。lval < rval。 Rが偽を返し、未定義ある場合
- (11.8.5を参照してください)。それ以外の場合は、を返します。
これは、すべての関係演算子に当てはまります。 アルゴリズムはundefined
の結果を持ちますが、演算子はそれをfalse
に変換します。それは理にかなっています。 1
は、< NaN
ではありません(> NaN
、または== NaN
、または... :-))。
(ニースはスペックを読んでいる人を見てください)
セクション11.8.5:http://es5.github.com/#x11.8.5 –
ああ!どうもありがとう! – Sacha
+1質問のスペックを引用してください。 :-) – RobG
Javascriptのfalse/NaN/0/undefined/""/nullの問題を間違いなく調べる必要があります。それはひどく矛盾しており、この(そうでなければかなり良い)言語の最も深刻な欠陥の一つです。 –
@SF:もしそれが本当に厳しいのであれば、人々は*その代わり*に不平を言うでしょう。 :-)ルールは実際にそれほど悪くないわけではなく、実際にはこの特定の例はfalse/NaN/0/undefined/""/nullのものとは何の関係もありません。仕様にはリレーションがどのように動作するかを示すこのセクションがありますが、引用したセクションで作業を行ったことを他の場所で調べる必要があります。実際のオペレータの方が多くあります。 –