2014-10-17 23 views
24

क्यों जबकि isUndefined() जावास्क्रिप्ट में एक isNaN() समारोह के रूप में लिखा जाना चाहिए वहाँ है?जावास्क्रिप्ट में isNaN() फ़ंक्शन क्यों है लेकिन कोई भी परिभाषित नहीं है()?</p> <pre><code>typeof(...) != "undefined" </code></pre> <p>एक बात मैं नहीं दिख रहा है:

मेरी राय में यह वास्तव में isUndefined(testValue) की बजाय इसे लिखने के लिए बदसूरत है।

+6

अच्छा प्रश्न है। लेकिन मुझे लगता है कि यह प्रोग्रामर एसई (वैचारिक बात) में बेहतर है। इसके अतिरिक्त, अंडरस्कोर की तरह उपयोगिता libs ['_.isUndefined'] है (http://underscorejs.org/#isUndefined) – Joseph

+4

स्टैक ओवरफ्लो में बहुत निराश है। इस सवाल को पूरी तरह से पढ़ने के लिए कोई भी परेशान नहीं है। – simonzack

+15

@ सिमोनज़ैक यह एक मूर्ख सवाल है। क्यों * एक अनिश्चित() 'होना चाहिए? क्यों नहीं 'isnull() 'भी है? या 'EEmptyString() 'है? या उस मामले के लिए '17()' है? – Pointy

उत्तर

15

उपयोग के मामले var === undefined लगभग हर जगह काम करता है, this answer, जहां या तो undefined एक मूल्य असाइन किया गया है, या var अपरिभाषित है के द्वारा कवर मामलों को छोड़कर।

कारण ऐसा कोई कार्य मौजूद नहीं है, बाद के मामले से स्पष्ट है। यदि var अपरिभाषित है, तो अनुमानित फ़ंक्शन isUndefined(var) पर कॉल करने के परिणामस्वरूप ReferenceError होगा। हालांकि एक नया कीवर्ड शुरू करना, उदा। isundefined var इस मुद्दे को हल कर सकता है।

लेकिन मान्य होने के बावजूद, उपरोक्त दोनों मामले जावास्क्रिप्ट के खराब उपयोग हैं। यही कारण है कि मेरा मानना ​​है कि ऐसा कोई कीवर्ड मौजूद नहीं है।

+0

वैरिएबल मौजूद होने वाले मौजूदा दायरे को संदर्भित करते हुए आप * if var 'अपरिभाषित' * समस्या के आसपास हो सकते हैं। यदि चर वैश्विक है, तो हम जांच सकते हैं कि यह 'window.foo' या 'window [' foo '] में पास करके अपरिभाषित है (जहां' foo' हमारे अपरिभाषित चर है) बल्कि 'foo'' के बजाय। यहां हमारा कार्य है: 'फ़ंक्शन isndified (वैल) {वापसी वैल === अपरिभाषित; } ', यहां हमारा परीक्षण है: 'isUndefined (window.foo) है;' परिणाम 'सत्य' होगा, क्योंकि कोई वैश्विक' foo' चर परिभाषित नहीं है। –

+0

@JamesDonnelly यह 'window.foo === अपरिभाषित 'के बराबर है, जो आईएमओ वास्तव में प्रश्न का उत्तर नहीं देता है, जो' टाइपोफ 'विधि के विकल्प के लिए पूछता है। – simonzack

+9

कारण 'isUndefined() 'मौजूद नहीं है क्योंकि यह आवश्यक नहीं है। जैसा कि पॉइंटी ने इस सवाल पर आपकी टिप्पणी का जवाब दिया, अगर हमारे पास 'अनिश्चित() है, तो हमारे पास' isNull() 'या' is17() 'क्यों नहीं है। 'isNaN()' एक आवश्यकता है, क्योंकि NaN मान एक-दूसरे से अलग नहीं हैं। 'NaN'' NaN' के बराबर नहीं है। दूसरी तरफ, 'अपरिभाषित', * * अपरिभाषित 'के बराबर है। –

3

isUndefined रूप

testValue === undefined 

हर दूसरे मूल्य के लिए की तरह लिखा जा सकता है।

यह NaN के साथ काम नहीं करता है, हालांकि NaN !== NaN के रूप में। तुलना करने की क्षमता के बिना, NaN मानों का पता लगाने के लिए isNaN फ़ंक्शन की आवश्यकता थी।

27

isUndefined() फ़ंक्शन के लिए बस कोई आवश्यकता नहीं है। इस के पीछे कारण ECMAScript specification में समझाया गया है:

(ध्यान दें कि NaN मूल्य कार्यक्रम अभिव्यक्ति NaN द्वारा निर्मित है।) कुछ कार्यान्वयन में, बाहरी कोड विभिन्न नहीं-एक के बीच एक अंतर पता लगाने में सक्षम हो सकता है -नंबर मूल्य, लेकिन ऐसा व्यवहार कार्यान्वयन-निर्भर है; ECMAScript कोड के लिए, सभी NaN मान एक दूसरे से से अलग नहीं हैं।

isNaN() समारोह का पता लगाने के लिए कि क्या कुछ NaN है क्योंकि समानता ऑपरेटरों काम नहीं करते (आपकी अपेक्षानुसार, नीचे देखें) उस पर एक तरीके के रूप में कार्य करता है। एक NaN मूल्य एक और NaN मूल्य के बराबर नहीं है:

NaN === NaN; // false 

undefined पर दूसरी ओर अलग है, और undefined मूल्यों से अलग पहचाना हैं:

undefined === undefined; // true 

आप कैसे जानने के लिए उत्सुक हैं, तो isNaN() फ़ंक्शन काम करता है, ईसीएमएस्क्रिप्ट विनिर्देश also explains this for us भी:

  1. संख्या संख्या को संख्या (संख्या) दें।
  2. ReturnIfAbrupt (num)।
  3. यदि संख्या NaN है, तो वापस लौटें।
  4. अन्यथा, झूठी वापसी करें।

अगर एक मूल्य के एक्स एक NaN प्रपत्र एक्स की एक अभिव्यक्ति है है ECMAScript कोड का परीक्षण करने के लिए एक विश्वसनीय तरीका! == एक्स परिणाम सच यदि और केवल यदि एक्स एक NaN है किया जाएगा।

NaN !== NaN; // true 
100 !== 100; // false 

var foo = NaN; 
foo !== foo; // true 
+2

कि 'NaN === NaN' गलत है वास्तव में ठीक है कि आपको' isNaN' की आवश्यकता क्यों नहीं है। जैसा कि आप उद्धृत दस्तावेज कहते हैं, 'NaN! == NaN' के लिए परीक्षण पूरी तरह से पर्याप्त है। तदनुसार, यह कहना उपयोगी नहीं है कि 'isUndefined() 'मौजूद नहीं है क्योंकि इसकी आवश्यकता नहीं है क्योंकि' isNaN() 'मौजूद है और यह बिल्कुल अनुपयोगी है। –

+11

@LightnessRacesinOrbit वास्तव में नहीं। 'NaN' के लिए तुलना करने के लिए 'isNaN()' फ़ंक्शन स्वयं के विरुद्ध मूल्य की तुलना करता है। 'IsNaN (myReallyLongObject.myReallyLongVariableName) को कॉल करना' myReallyLongObject.myReallyLongVariableName को कॉल करने से कहीं अधिक वांछनीय है! == myReallyLongObject.myReallyLongVariableName'। 'अपरिभाषित' के साथ, आप बस 'myReallyLongObject.myReallyLongVariableName === अपरिभाषित' होगा। चेक 'परिवर्तनीय नहीं है! == NaN', यह' चर! == चर' है। यह चीजों को पढ़ने में भ्रमित कर देगा, जबकि 'isNaN()' विधि आपको बताती है कि किसके लिए जांच की जा रही है। –

+0

@ जेम्स, आपको उस अंतिम भाग को अपने उत्तर में जोड़ना चाहिए। एक 'isNaN() 'फ़ंक्शन क्यों समझ में आता है। लोग जगह पर 'x! == x' डाल सकते हैं, लेकिन यह तुरंत यह स्पष्ट नहीं हो सकता है कि चेक का उद्देश्य क्या है और इसलिए उपयोग में भ्रम और त्रुटि का अधिक जोखिम होता है। 'isNaN()' क्रिस्टल स्पष्ट है। –

0

यह प्रश्न का सीधा जवाब नहीं है क्योंकि अन्य लोगों ने पहले से ही उत्तर दिया है, पुस्तकालयों को हाइलाइट करना अधिक है जिनमें किसी भी व्यक्ति के लिए त्वरित समाधान की तलाश करने के लिए एक अनिश्चित() फ़ंक्शन शामिल है और वे उनका उपयोग करने की स्थिति में हैं।

अंडरस्कोर और लो-डैश दोनों में एक अनिश्चित() फ़ंक्शन, उत्तरार्द्ध है, क्योंकि यह अंडरस्कोर पर बनाया गया है।

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