2011-07-13 10 views
20

(1 < NaN)false और undefined (जावास्क्रिप्ट में) क्यों देता है?जावास्क्रिप्ट में (1 <NaN) क्यों झूठा है?

"11.8.5 सार रिलेशनल तुलना एल्गोरिदम" में यह कहता है कि यदि किसी भी मान NaN (ToPrimitive और ToNumber के बाद जो मेरे दृश्य में NaN को प्रभावित नहीं करना चाहिए) परिणाम undefined है।

एफएफ और क्रोम में मैं मिलता है:

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

कि क्यों है?

+4

+1 एक प्रश्न में spec उद्धृत करने के लिए +1। :-) – RobG

+3

आपको निश्चित रूप से जावास्क्रिप्ट की झूठी/NaN/0/अपरिभाषित/""/शून्य समस्याओं में देखना चाहिए। यह बेहद असंगत है और इसकी सबसे गंभीर त्रुटियों में से एक है (अन्यथा काफी अच्छी) भाषा। –

+0

@ एसएफ: और यदि यह वास्तव में सख्त था, तो लोग * इसके बजाय * शिकायत करेंगे। :-) नियम वास्तव में सभी बुरे नहीं हैं, और वास्तव में इस विशेष उदाहरण के पास झूठी/NaN/0/अपरिभाषित/""/शून्य चीज़ से कोई लेना देना नहीं है। यह और अधिक है कि विनिर्देश में यह खंड है कि संबंध कैसे काम करते हैं, लेकिन फिर आपको यह देखने के लिए कहीं और देखना होगा कि उद्धृत खंड में काम करने के बाद, वास्तविक ऑपरेटर ऐसा करता है। –

उत्तर

15

क्योंकि < ऑपरेटर false देता है जब अमूर्त संबंधपरक एल्गोरिदम undefined देता है। Section 11.8.1 देखें:

11.8.1 कम-से ऑपरेटर (<)

उत्पादन RelationalExpression: RelationalExpression < ShiftExpression के रूप में मूल्यांकन किया जाता है इस प्रकार है:

  1. lref चलो का मूल्यांकन करने का नतीजा RelationalExpression
  2. lval GetValue (lref) दें।
  3. rrefShiftExpression का मूल्यांकन करने का परिणाम बनें।
  4. रावल प्राप्त करें GetValue (rref)।
  5. आर अमूर्त संबंधपरक तुलना lval < रावल करने का परिणाम बनें। (11.8.5 देखें)
  6. तो आरअपरिभाषित है, झूठी लौट आते हैं। अन्यथा, आर पर लौटें।

यह सभी रिलेशनल ऑपरेटरों के लिए सच है। एल्गोरिदम में undefined परिणाम है, लेकिन ऑपरेटर इसे false में परिवर्तित करें। और यह समझ में आता है। 1< NaN नहीं है (न ही यह > NaN, या == NaN, या ... :-)) है।

(लोगों को spec पढ़ने के लिए अच्छा लगा।)

+0

धारा 11.8.5: http://es5.github.com/#x11.8.5 –

+0

आह! आपका बहुत बहुत धन्यवाद! – Sacha

संबंधित मुद्दे