2014-09-07 18 views

उत्तर

7

NaN लगता नहीं कुछ भी करने के लिए बराबर है, खुद को भी है। समानता के बजाय NaN का पता लगाने के लिए isNaN का उपयोग करें।

NaN === NaN // -> false 
isNaN(NaN) // -> true (argument is coerced [ToNumber] as required) 
x = NaN 
x !== x  // -> true (would be false for any other value of x) 
NaN || "Hi" // -> "Hi" (NaN is a false-y value, but not false) 

यह आईईईई-754 निम्न JavaScript का परिणाम है और यह (शांत) है NaN lack-of-ordering behavior:

एक NaN साथ तुलना हमेशा यहाँ तक कि एक अव्यवस्थित [बराबर नहीं] परिणाम देता है जब खुद के साथ तुलना।

भी What is the rationale for all comparisons returning false for IEEE754 NaN values?

+1

आज़माएं क्वांटम भौतिकी का हिस्सा है? – 8DK

+0

तो यह व्यवहार की उम्मीद है! यह बताता है कि मैंने इसे [wtf] (http://wtfjs.com/) [जावास्क्रिप्ट] (https://www.destroyallsoftware.com/talks/wat) सामग्री में क्यों देखा है, मैंने इसे देखा है। – iabw

+0

@iabw हां, यह उम्मीद है। मुझे लगता है कि यह एक प्रत्यक्ष जांच बल्कि बार-बार आता है। अधिकतर कोड संभावित रूप से 0 के रूप में इस तरह के parseInt के परिणाम को जोड़ता है या 0/झूठी-वाई को अमान्य होने पर विचार करता है (क्योंकि NaN अभी भी एक flase-y मान है)। साथ ही, यह नाएन व्यवहार समान फ़्लोटिंग पॉइंट प्रकारों का उपयोग करके अन्य भाषाओं में पृष्ठभूमि वाले लोगों को आश्चर्यचकित नहीं करेगा (जो नहीं), जो उनमें से अधिकतर है। – user2864740

2

इसका देखें क्योंकि NaN === NaN भी गलत है!

3

NaN खुद के बराबर नहीं है और कारण जवाब स्टीफन here द्वारा पोस्ट की गई से समझा जा सकता है:

कहाँ से बात कर से मेरी समझ है कि NaN = NaN उत्पन्न दो व्यावहारिक कारणों से बाहर:

  • कि x == y जब भी संभव हो (असली गणित के प्रमेय होने के बजाए x - y == 0 के बराबर होना चाहिए, इस हार्डवेयर compar के कार्यान्वयन बनाता है ison अधिक स्थान कुशल, समय मानक विकसित किया गया था पर अत्यंत महत्व का था जो - ध्यान दें, तथापि, इस एक्स = y = अनंत के लिए उल्लंघन किया जाता है, तो यह अपने आप ही एक महान कारण नहीं है कि; यह x - y == 0 or NaN पर उचित रूप से झुका हुआ हो सकता है)।

  • अधिक महत्वपूर्ण बात यह है कि isnan() उस समय अनुमानित था जब NaN को 8087 अंकगणित में औपचारिक रूप दिया गया था; यह NaN मानों isnan() जो कई वर्षों का समय लग सकता की तरह कुछ प्रदान प्रोग्रामिंग भाषाओं पर निर्भर नहीं था पता लगाने के लिए एक सुविधाजनक और कुशल साधनों के साथ प्रोग्रामर प्रदान करने के लिए जरूरी हो गया था। मैं इस विषय पर कहां की अपनी लेखन बोली होगी:

कोई रास्ता नहीं Nans से छुटकारा पाने के थे, वे Indefinites Crays पर के रूप में के रूप में बेकार हो सकता है; जैसे ही एक का सामना करना पड़ा रहे थे, गणना सबसे अच्छा के बजाय बंद कर दिया जाना होगा अनिश्चितकालीन निष्कर्ष पर अनिश्चितकालीन समय के लिए जारी रखा। यही कारण है कि NaNs पर कुछ संचालन गैर-NaN परिणामों को वितरित करना चाहिए। कौन सा ऑपरेशन? ... अपवाद सी विधेय "एक्स == एक्स" और "एक्स = एक्स!" कर रहे हैं, जो क्रमशः 1 और 0 के हर अनंत या परिमित संख्या एक्स के लिए लेकिन रिवर्स अगर एक्स एक संख्या नहीं है (NaN); इन भाषाओं कि NaN के लिए एक शब्द और एक विधेय IsNaN कमी में Nans और संख्याओं के बीच केवल सरल साधारण भेद प्रदान (एक्स)।

ध्यान दें कि यह भी तर्क है कि एक "नहीं-ए-बूलियन" की तरह कुछ लौटने बाहर नियम है। हो सकता है कि यह व्यावहारिकता गुम हो गई, और मानक को isnan() की आवश्यकता होनी चाहिए, लेकिन NaN ने वर्षों के लिए कुशलतापूर्वक और आसानी से उपयोग करना लगभग असंभव था, जबकि दुनिया प्रोग्रामिंग भाषा गोद लेने के लिए इंतजार कर रही थी। मैं विश्वास नहीं करता कि एक उचित व्यापारिक रहा होगा।

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