दिलचस्प पोस्ट
परिभाषित समयबाह्य के साथ जावा HTTP क्लाइंट अनुरोध कोड-पीछे से App_Code वर्ग को कॉल करने में असमर्थ एक श्रेणी के भीतर 'एन' अनोखी यादृच्छिक संख्या उत्पन्न करें वेरिएबल तर्कों को एक अन्य फ़ंक्शन पर पास करना जो एक चर तर्क सूची को स्वीकार करता है मैं easy_install / setuptools / distutils में पोस्ट-इंस्टॉल स्क्रिप्ट कैसे जोड़ सकता हूं? क्या मैं जावा फ़ाइल को कक्षा से अलग नाम के साथ संकलित कर सकता हूं? Git-svn कैसे एक सबवर्जन रिपॉजिटरी से अंतिम एन पुनरीक्षण को क्लोन करता है? PHP में एक उद्धरण को छोड़कर जब MySQL में प्रवेश करें दो उपयोगकर्ताओं के बीच सामाजिक दूरी की गणना करें सी प्रीप्रोसेसर में थोड़ी देर लूप लेखन टेक्स्ट के रूप में Gmail से पीडीएफ-अटैचमेंट प्राप्त करें यादृच्छिक संख्या पीढ़ी – उसी नंबर को वापस jQuery के पृष्ठ पर अंक लगाना प्लगइन AngularJS में देखने / आंशिक विशिष्ट स्टाइल को कैसे शामिल करें क्लिक करें ड्रॉपडाउन मेनू पर क्लिक करें अंदर पर क्लिक करें

क्यों है एनएएन ("") समान झूठी है?

मेरे पास एक त्वरित सवाल है (मुझे उम्मीद है!) जेएस में, isNaN(" ") गलत क्यों मूल्यांकन करता है, लेकिन क्या isNaN(" x") सच का मूल्यांकन करता है?

मैं पाठ इनपुट फ़ील्ड पर संख्यात्मक कार्रवाइयां निष्पादित कर रहा हूं, और जांच रहा हूं कि फ़ील्ड रिक्त है, "", या NaN जब कोई व्यक्ति क्षेत्र में कुछ मुट्ठी भर का स्थान रखता है, तो मेरी मान्यता तीनों में विफल हो जाती है, और मुझे इस बात के बारे में उलझन में लग रहा है कि यह क्यों नॉन-एनएएन की जांच करता है।

धन्यवाद!

वेब के समाधान से एकत्रित समाधान "क्यों है एनएएन ("") समान झूठी है?"

जावास्क्रिप्ट एक खाली स्ट्रिंग को 0 के रूप में परिभाषित करता है, जो कि आईएनएन टेस्ट में विफल रहता है। आप स्ट्रिंग पर parseInt का उपयोग कर सकते हैं जो खाली स्ट्रिंग को 0 में कनवर्ट नहीं करेगा। नतीजा तब होना चाहिए जब नैन है।

आपको यह आश्चर्यजनक या शायद नहीं मिल सकता है, लेकिन यहां कुछ परीक्षण कोड है जो आपको जावास्क्रिप्ट इंजन की निराशा दिखा रहा है।

 document.write(isNaN("")) // false document.write(isNaN(" ")) // false document.write(isNaN(0)) // false document.write(isNaN(null)) // false document.write(isNaN(false)) // false document.write("" == false) // true document.write("" == 0) // true document.write(" " == 0) // true document.write(" " == false) // true document.write(0 == false) // true document.write(" " == "") // false 

तो इसका मतलब है कि

 " " == 0 == false 

तथा

 "" == 0 == false 

परंतु

 "" != " " 

मज़े करो 🙂

उपयोग करने का प्रयास करें:

 alert(isNaN(parseInt(" "))); 

या

 alert(isNaN(parseFloat(" "))); 

इसे बेहतर समझने के लिए, कृपया पृष्ठ 43 पर एक्का-स्क्रिप्ट स्पेक पीडीएफ खोलें "स्ट्रिंग टाइप करने के लिए टूनम्बर एप्लाइड"

अगर एक स्ट्रिंग में एक संख्यात्मक वाक्यविन्यास होता है, जिसमें किसी भी संख्या में श्वेत-स्पेस वर्ण हो सकते हैं, इसे नंबर प्रकार में परिवर्तित किया जा सकता है। रिक्त स्ट्रिंग 0 का मूल्यांकन करता है। स्ट्रिंग 'इन्फिनिटी' को भी देना चाहिए

 isNaN('Infinity'); // false 

MDN से आप जिस समस्या का सामना कर रहे हैं उसका कारण

जब isNa फ़ंक्शन का तर्क प्रकार संख्या से नहीं होता है, तो मान पहले किसी संख्या से जबरदस्त होता है इसके परिणामस्वरूप मान को यह निर्धारित करने के लिए जांच की जाती है कि क्या वह NaN है या नहीं

आप निम्नलिखित व्यापक उत्तर की जांच कर सकते हैं जो कि समानता के लिए NaN की तुलना में भी शामिल है।

कैसे जावास्क्रिप्ट चर NaN यह कैसे परीक्षण करें

मुझे लगता है कि यह जावास्क्रिप्ट के टाइपिंग के कारण है: ' ' को शून्य में बदल दिया जाता है, जबकि 'x' नहीं है:

 alert(' ' * 1); // 0 alert('x' * 1); // NaN 

यदि आप एक सटीक संख्या संख्या कार्यान्वयन करना चाहते हैं, तो यह जावास्क्रिप्ट से एक तरीका है : द गुगल पार्ट्स द्वारा डगलस क्रॉकफोर्ड [पृष्ठ 105]

 var isNumber = function isNumber(value) { return typeof value === 'number' && isFinite(value); } 

उत्तर-पूर्ण-सही उत्तर

एंटोनियो हैली का अत्यधिक अपवर्जित और स्वीकृत उत्तर यहां एक गलत धारणा बनाता है कि यह प्रक्रिया जावास्क्रिप्ट के parseInt फ़ंक्शन के माध्यम से जाती है:

आप स्ट्रिंग पर parseInt का उपयोग कर सकते हैं … परिणाम तो असफल होना चाहिए NAN

हम इस कथन को आसानी से "123abc" स्ट्रिंग के साथ अस्वीकार कर सकते हैं:

 parseInt("123abc") // 123 (a number... isNaN("123abc") // true ...which is not a number) 

इसके साथ, हम देख सकते हैं कि जावास्क्रिप्ट के "123abc" फ़ंक्शन "123abc" को नंबर 123 रूप में देता है, फिर भी इसकी isNaN समारोह हमें बताती है कि "123abc" संख्या नहीं है।

सही उत्तर

isNaN -262 परिभाषित करता है कि isNaN जांच धारा 18.2.3 में कैसे काम करती है।

18.2.3 isNaN (संख्या)

isNaN समारोह %isNaN% आंतरिक वस्तु है। जब isNaN फ़ंक्शन को एक तर्क संख्या के साथ कहा जाता है, तो निम्नलिखित कदम उठाए जाते हैं:

  1. चलो num हो? ToNumber(number)
  2. यदि num है, तो true
  3. अन्यथा, false वापसी।

ToNumber फ़ंक्शन यह संदर्भ ECMAScript-262 के खंड 7.1.3 में भी परिभाषित किया गया है। यहां, हमें यह बताया जाता है कि जावास्क्रिप्ट स्ट्रिंग्स को किस तरह से संभालता है जो इस फ़ंक्शन में पास किए जाते हैं।

प्रश्न में दिया गया पहला उदाहरण एक स्ट्रिंग है जिसमें सफेद स्पेस वर्ण नहीं हैं। यह खंड बताता है कि:

एक StringNumericLiteral जो खाली है या इसमें केवल सफेद स्थान को +0 कनवर्ट किया गया है

" " उदाहरण स्ट्रिंग को +0 परिवर्तित किया जाता है, जो कि एक संख्या है।

एक ही खंड में यह भी कहा गया है:

यदि व्याकरण String को StringNumericLiteral विस्तार के रूप में व्याख्या नहीं कर सकता है, तो ToNumber का नतीजा NaN

उस खंड में समाहित सभी चेक को उद्धृत किए बिना, प्रश्न में दिया गया " x" उदाहरण ऊपर की स्थिति में पड़ता है क्योंकि इसे StringNumericLiteral रूप में नहीं समझा जा सकता है " x" को NaN परिवर्तित किया जाता है

मुझे यकीन नहीं है कि क्यों , लेकिन इस समस्या को हल करने के लिए आप जाँचने से पहले हमेशा व्हाइटस्पेस को ट्रिम कर सकते हैं आप संभवत: ऐसा करना चाहते हैं कि वैसे भी।

फ़ंक्शन है isNaN("") एक स्ट्रिंग को नंबर प्रकार बलात्कार करता है

ईसीएमएस्क्रिप्ट 3-5 ऑपरेटर के प्रकार के लिए निम्नलिखित रिटर्न वैल्यू परिभाषित करता है:

  • अपरिभाषित
  • ऑब्जेक्ट (रिक्त, ऑब्जेक्ट्स, एरेज़)
  • बूलियन
  • संख्या
  • तार
  • समारोह

किसी फ़ंक्शन बॉडी में हमारे परीक्षण को लपेट करने के लिए बेहतर:

 function isNumber (s) { return typeof s == 'number'? true : typeof s == 'string'? (s.trim() === ''? false : !isNaN(s)) : (typeof s).match(/object|function/)? false : !isNaN(s) } 

यह फ़ंक्शन वैरिएबल प्रकार का परीक्षण करने का इरादा नहीं है, इसके बदले यह ज़ोरदार मान की जांच करता है। उदाहरण के लिए, बुलियन और स्ट्रिंग संख्या से ज़बरदस्त हो जाते हैं, इसलिए शायद आप इस फ़ंक्शन को कॉल करना चाहते हैं जैसे isNumberCoerced()

यदि स्ट्रिंग और संख्या के अलावा अन्य प्रकारों के लिए परीक्षण करने की कोई आवश्यकता नहीं है, तो निम्न स्निपेट को कुछ शर्त के भाग के रूप में इस्तेमाल किया जा सकता है:

 if (!isNaN(s) && s.toString().trim()!='') // 's' can be boolean, number or string alert("s is a number") 

मैं आपको निम्न फ़ंक्शन का उपयोग करने का सुझाव देता हूं यदि आप वास्तव में एक उचित जांच चाहते हैं कि यह एक पूर्णांक है:

 function isInteger(s) { return Math.ceil(s) == Math.floor(s); } 

यह है कि isNaN(" ") झूठा है, isNaN वैश्विक फ़ंक्शन के भ्रामक व्यवहार का एक हिस्सा है, क्योंकि संख्या-संख्याओं के एक संख्यात्मक प्रकार के बलात्कार के कारण।

एमडीएन से :

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

यह भी ध्यान रखें कि ECMAScript 6 के साथ, अब भी Number.isNaNNumber.isNaN विधि है, जो Number.isNaN अनुसार:

ग्लोबल की तुलना में, isNaN() फ़ंक्शन, नंबर। Number.isNaN() को पैरामीटर को किसी संख्या में जबरन रूप से परिवर्तित करने की समस्या नहीं होती है। इसका मतलब यह है कि वे अब ऐसे मूल्यों को पारित करने के लिए सुरक्षित हैं जो आमतौर पर NaN परिवर्तित हो जाते हैं, लेकिन वास्तव में NaN के समान मूल्य नहीं हैं। इसका यह भी अर्थ है कि टाइप नंबर्स के केवल मान, जो कि NaN भी हैं, true

दुर्भाग्य से :

यहां तक ​​कि ECMAScript 6 Number.isNaN पद्धति के अपने स्वयं के मुद्दे हैं, जैसा कि ब्लॉग पोस्ट में उल्लिखित है – बदसूरत जावास्क्रिप्ट और ES6 NaN समस्या को ठीक करना ।

isNAN हमेशा रिक्त स्थान के लिए कुछ भी नहीं है लेकिन रिक्त स्थान के लिए झूठी वापसी करेगा। मैं मूल्यांकन करने से पहले स्ट्रिंग स्ट्रिंग करने का सुझाव दूंगा

यह कार्य मेरे परीक्षणों में काम करने के लिए लग रहा था

 function isNumber(s) { if (s === "" || s === null) { return false; } else { var number = parseInt(s); if (number == 'NaN') { return false; } else { return true; } } } 

व्हाट अबाउट

 function isNumberRegex(value) { var pattern = /^[-+]?\d*\.?\d*$/i; var match = value.match(pattern); return value.length > 0 && match != null; } 

isNaN फ़ंक्शन को एक संख्या को अपनी तर्क के रूप में होने की उम्मीद है, इसलिए किसी भी अन्य प्रकार के तर्क (आपके मामले में एक स्ट्रिंग) को वास्तविक फ़ंक्शन तर्क से पहले नंबर पर कनवर्ट किया जाएगा। (ध्यान रखें कि NaN टाइप नंबर का मूल्य भी है!)

Btw। यह सभी अंतर्निहित कार्यों के लिए सामान्य है – यदि वे किसी निश्चित प्रकार के तर्क की अपेक्षा करते हैं, तो वास्तविक तर्क को मानक रूपांतरण कार्यों का उपयोग करके परिवर्तित किया जाएगा। सभी बुनियादी प्रकार (बूल, स्ट्रिंग, संख्या, ऑब्जेक्ट, डेट, रिक्त, अपरिभाषित) के बीच मानक रूपांतरण हैं।

Number String लिए मानक रूपांतरण Number() साथ स्पष्ट किया जा सकता है। तो हम यह देख सकते हैं कि:

  • Number(" ") 0 मूल्यांकन करता है
  • Number(" x") NaN मूल्यांकन करता है

यह देखते हुए, है isNaN समारोह का परिणाम पूरी तरह तार्किक है!

असली सवाल यह है कि मानक स्ट्रिंग-टू-संख्या रूपांतरण ऐसा क्यों करता है स्ट्रिंग-टू-संख्या रूपांतरण वास्तव में "123" या "17.5e4" जैसे संख्यात्मक स्ट्रिंग्स को समान संख्या में परिवर्तित करने के लिए है। रूपांतरण पहले प्रारंभिक श्वेत स्थान को छोड़ देता है (अतः "123" मान्य है) और फिर बाकी संख्या को पार्स करने की कोशिश करता है यदि यह एक संख्या ("एक्स" नहीं है) के रूप में पारस्परिक नहीं है, तो परिणाम नैन है लेकिन स्पष्ट विशेष नियम है कि एक स्ट्रिंग जो खाली है या केवल सफेद स्थान 0 में बदल जाती है। इसलिए यह रूपांतरण को बताता है।

संदर्भ: http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1

मैंने इस समस्या को सुलझाने में मदद करने के लिए इस त्वरित छोटी फ़ंक्शन को लिखा है

 function isNumber(val) { return (val != undefined && val != null && val.toString().length > 0 && val.toString().match(/[^0-9\.\-]/g) == null); }; 

यह केवल उन अक्षरों के लिए जांचता है जो संख्यात्मक (0-9) नहीं हैं, जो '-' या '।' नहीं हैं, और जो अपरिभाषित, शून्य या खाली नहीं हैं और अगर कोई मेल नहीं है 🙂

जावास्क्रिप्ट अंतर्निहित है, एनएएन फ़ंक्शन, है – जैसा कि डिफ़ॉल्ट रूप से अपेक्षित होना चाहिए – एक "डायनामिक टाइप ऑपरेटर"। इसलिए सभी मूल्य जो (डीटीसी प्रक्रिया के दौरान) एक साधारण सत्य उत्पन्न कर सकते हैं झूठे जैसे "", " ", " 000" , नाएन नहीं हो सकता

जिसका मतलब है कि पहले दिए गए तर्क के रूप में एक रूपांतरण से गुजरना होगा:

 function isNaNDemo(arg){ var x = new Number(arg).valueOf(); return x != x; } 

स्पष्टीकरण:

फ़ंक्शन बॉडी की शीर्ष पंक्ति में, हम (प्रथम) तर्क को सफलतापूर्वक एक नंबर ऑब्जेक्ट में बदलने की कोशिश कर रहे हैं। और (द्वितीय), डॉट ऑपरेटर का इस्तेमाल करके हम अपनी सुविधा के लिए – तत्काल अलग करना, निर्मित ऑब्जेक्ट के आदिम मान

दूसरी पंक्ति में, हम पिछले चरण में प्राप्त मूल्य ले रहे हैं, और इस तथ्य का फायदा है कि नाएन ब्रह्मांड में किसी भी वस्तु के बराबर नहीं है, यहां तक ​​कि खुद भी नहीं, उदा: NaN == NaN >> false अंत में तुलना करने के लिए यह (असमानता के लिए) स्वयं के साथ

इस प्रकार फ़ंक्शन रिटर्न केवल तभी सही होगा जब, और केवल अगर, आपूर्ति की गई तर्क-वापसी, किसी संख्या ऑब्जेक्ट में रूपांतरण का असफल प्रयास है, अर्थात्, एक न-संख्या संख्या; जैसे, नाएन


हैनास्टीटिक ()

हालांकि, एक स्टेटिक टाइप ऑपरेटर के लिए – यदि आवश्यक हो और जब आवश्यक हो – हम एक बहुत सरल कार्य लिख सकते हैं जैसे कि:

 function isNaNstatic(x){ return x != x; } 

और डीटीसी से पूरी तरह से बचें ताकि तर्क स्पष्ट रूप से एक नाएनएन नंबर न हो, यह झूठी वापसी करेगा। इसलिए, निम्नलिखित के खिलाफ परीक्षण:

isNaNStatic(" x"); // will return false isNaNStatic(" x"); // will return false क्योंकि यह अभी भी एक स्ट्रिंग है

हालांकि: isNaNStatic(1/"x"); // will of course return true. isNaNStatic(1/"x"); // will of course return true. उदाहरण के लिए isNaNStatic(NaN); >> true isNaNStatic(NaN); >> true

लेकिन isNaN विपरीत है, isNaNStatic("NaN"); >> false isNaNStatic("NaN"); >> false क्योंकि यह (तर्क) एक साधारण स्ट्रिंग है।

ps: isNa का स्थिर संस्करण आधुनिक कोडिंग परिदृश्यों में बहुत उपयोगी हो सकता है। और यह बहुत अच्छी तरह से मुख्य कारणों में से एक हो सकता है क्योंकि मैं इसे पोस्ट करने के लिए अपना समय लगाता था।

सादर।

isNAN(<argument>) यह बताता है कि दी गई तर्क अवैध संख्या है या नहीं। isNaN प्रकार प्रकार में तर्कों को टाइप करें। यदि आप यह देखना चाहते हैं कि तर्क संख्यात्मक है या नहीं? JQuery में $.isNumeric() फ़ंक्शन का उपयोग करें

यह है, isNaN (foo) isNa (संख्या (foo)) के बराबर है, यह किसी भी स्ट्रिंग्स को स्वीकार करता है जिसमें सभी संख्याएं स्पष्ट संख्या के लिए संख्या के रूप में होती हैं। पूर्व के लिए

 isNaN(123) //false isNaN(-1.23) //false isNaN(5-2) //false isNaN(0) //false isNaN('123') //false isNaN('Hello') //true isNaN('2005/12/12') //true isNaN('') //false isNaN(true) //false isNaN(undefined) //true isNaN('NaN') //true isNaN(NaN) //true isNaN(0 / 0) //true 

जैसा कि दूसरे ने समझाया है कि isNaN फ़ंक्शन रिक्त स्ट्रिंग को इसे मान्य करने से पहले एक संख्या में मजबूर कर देगा, इस प्रकार एक खाली स्ट्रिंग को 0 (जो कि एक मान्य संख्या है) में बदलती है। हालांकि, मुझे पता चला कि parseInt फ़ंक्शन किसी खाली स्ट्रिंग या केवल रिक्त स्थान के साथ एक स्ट्रिंग को पार्स करने की कोशिश करते समय NaN वापस करेगा। जैसे कि निम्न संयोजन अच्छा काम कर रहे हैं:

if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');

यह चेक दशमलव अंकों के साथ सकारात्मक संख्या, नकारात्मक संख्याओं और संख्याओं के लिए काम करेगा, इसलिए मुझे विश्वास है कि यह सभी सामान्य संख्यात्मक मामलों को शामिल करता है।

मैं इसका उपयोग करता हूँ

  function isNotANumeric(val) { if(val.trim && val.trim() == "") { return true; } else { return isNaN(parseFloat(val * 1)); } } alert(isNotANumeric("100")); // false alert(isNotANumeric("1a")); // true alert(isNotANumeric("")); // true alert(isNotANumeric(" ")); // true