2015-12-15 9 views
8

मैं StackOverflow पर समान सवाल और जवाब दिया गया है और इस पाया:क्यों संख्या ('') करता है देता है 0 जबकि parseInt ('') रिटर्न NaN

parseInt("123hui") 
returns 123 

Number("123hui") 
returns NaN 

के रूप में, parseInt() पहली गैर करने के लिए पार्स -digit और रिटर्न जो कुछ भी यह पार्स था और Number() की कोशिश करता एक नंबर, parseInt('') और Number('') के मामले में क्यों संभावना नहीं व्यवहार में पूरी स्ट्रिंग कन्वर्ट करने के लिए।

मुझे लगता है आदर्श parseIntNaN लौटना चाहिए जैसे यह Number("123hui")

अब मेरा अगला सवाल के साथ करता है:

0 == '' के रूप में रिटर्न true मेरा मानना ​​है कि यह 0 == Number('') जो सच है की तरह व्याख्या करता है। तो क्या संकलक वास्तव में 0 == Number('') जैसा व्यवहार करता है और 0 == parseInt('') की तरह नहीं है या क्या मुझे कुछ बिंदु याद आ रही है?

+6

ठीक है, यह ठीक है कि इसे कैसे काम करने के लिए डिज़ाइन किया गया था। या शायद उस तरह से काम करने के लिए विकसित किया। किसी भी तरह से, इसे बदलने के लिए बहुत देर हो चुकी है। और दोनों तरीकों के लिए अच्छे उपयोग-मामले हैं। आपको बस उचित विकल्प चुनना होगा। – Thilo

+0

यह भी ध्यान दें कि 'संख्या' फ़्लोटिंग-पॉइंट संख्याओं का भी समर्थन करता है, केवल पूर्णांक नहीं। – Thilo

+0

आदर्श रूप से या नहीं, ऐसा नहीं है कि यह कैसे काम करता है। आप https://www.youtube.com/watch?v=FqhZZNUyVFM का आनंद ले सकते हैं हालांकि – pvg

उत्तर

4

अंतर प्रकार बलात्कार के लिए अतिरिक्त तर्क के Number() बनाने उपयोग करने के लिए भाग में कारण है। उस के लिए the rules it follows में शामिल है:

  • एक StringNumericLiteral कि खाली है या होता है केवल सफेद स्थान +0 में बदल जाती है।

parseInt() जबकि दिया जाता है या radix का पता चला के आधार पर, बस खोजने के लिए और इनपुट में संख्यात्मक वर्ण का मूल्यांकन करने के परिभाषित किया गया है। और, इसे कम से कम एक वैध चरित्र की उम्मीद करने के लिए परिभाषित किया गया था।

13) एस एक कोड इकाई है जो किसी radix- आर अंकों नहीं है शामिल है, तो जेडएस इस तरह की पहली कोड इकाई से पहले सभी कोड इकाइयों से मिलकर की सबस्ट्रिंग रहने दो; अन्यथा, जेड हो एस करते हैं।

14) यदि जेड खाली है, NaN वापस लौटें।

नोट: 'एस' इनपुट स्ट्रिंग के बाद किसी भी प्रमुख व्हाइटस्पेस निकाल रहा है।


0=='' के रूप में रिटर्न true मेरा मानना ​​है कि यह व्याख्या की तरह 0==Number('') [...]

नियम है कि == का उपयोग करता है Abstract Equality के रूप में परिभाषित कर रहे हैं।

और, आप बलात्कार/रूपांतरण है कि इस्तेमाल किया के बारे में सही कर रहे हैं।प्रासंगिक कदम # 6:

प्रकार (एक्स) संख्या और प्रकार (y) स्ट्रिंग है,
वापसी तुलना का परिणाम एक्स == ToNumber (y है)।

+0

अपनी सामान्य समानता तुलना के लिए (जब आप एक ही समय में प्रकारों को रूपांतरित करने की कोशिश नहीं करते हैं), आमतौर पर '=== 'के बजाय' === 'करना बेहतर होता है और प्रकार जबरन भ्रम से बचें। – Thilo

+0

@ थिलो: ठीक है, जब आप प्रकारों को परिवर्तित नहीं करते हैं क्योंकि दोनों एक जैसे हैं (जैसा कि होना चाहिए), कोई भ्रम नहीं है और आप केवल '==' का उपयोग कर सकते हैं। – Bergi

-1

parseInt("")NaN है मानक कहते हैं क्योंकि बहुत भले ही +""0 है बजाय (यह भी मानक तो कहते हैं, उदाहरण है कि "" == 0 के लिए जिसका अर्थ है बस क्योंकि)।

इसमें तर्क की तलाश न करें क्योंकि कोई गहरा गहरा तर्क नहीं है, बस इतिहास

आप मेरी राय में एक बड़ी गलती कर रहे हैं ... जितनी जल्दी आप इसे बेहतर करेंगे, प्रोग्रामिंग जीवन के लिए जावास्क्रिप्ट के साथ बेहतर होगा। गलती यह है कि आप यह मान रहे हैं कि प्रोग्रामिंग भाषाओं में किए गए हर विकल्प और उनके बारे में हर तकनीकी विवरण तार्किक है। यह बिल्कुल सही नहीं है।

खासकर जावास्क्रिप्ट के लिए।

कृपया याद रखें कि जावास्क्रिप्ट को भीड़ में "डिजाइन" किया गया था और केवल भाग्य की वजह से, यह रात भर बेहद लोकप्रिय हो गया। इसने समुदाय को विवरणों के किसी भी गंभीर विचार से पहले इसे मानकीकृत करने के लिए मजबूर कर दिया और इसलिए मैदान पर किसी भी गंभीर परीक्षण से पहले यह मूल रूप से अपने वर्तमान दुखद राज्य में "जमे हुए" था।

भागों है कि इतना बुरा वे भी अजीब (जैसे with बयान या == समानता ऑपरेटर कि इतने टूट गया है कि गंभीर js IDEs चेतावनी दी है इसके बारे में के बारे में कोई उपयोग नहीं कर रहे हैं कर रहे हैं: आप A==B तरह बातें मिलता है, B==C और A!=C भी किसी भी "विशेष" मूल्य बिना सिर्फ सामान्य मूल्यों और का उपयोग कर null, undefined, NaN या खाली स्ट्रिंग "" और इसलिए नहीं कि सटीक समस्याओं की) की तरह।

बकवास विशेष मामले जावास्क्रिप्ट में हर जगह हैं और उन्हें लॉजिकल फ्रेम में रखने की कोशिश कर रहा है, दुर्भाग्य से, एक बर्बाद प्रयास है। बस बहुत कुछ पढ़कर और अपने द्वारा प्रदान किए जाने वाले शानदार रनटाइम पर्यावरण का आनंद लें (यह वह जगह है जहां जावास्क्रिप्ट वास्तव में चमकता है ... ब्राउज़र और उनके जेआईटी तकनीक का एक प्रभावशाली टुकड़ा है: आप कुछ लाइनें लिख सकते हैं और वास्तविक उपयोगी सॉफ्टवेयर चला सकते हैं विभिन्न कंप्यूटिंग उपकरणों के एक gajillion पर)।

आधिकारिक मानक जहां सभी विषमताएं गणना की जाती हैं, पढ़ने के लिए काफी कठिन है क्योंकि इसका लक्ष्य बहुत सटीक होना है, और दुर्भाग्य से नियमों को निर्दिष्ट करना वास्तव में जटिल है। उदाहरण क्या ES5 सिर्फ एक और अजीब "विशेष" मामले के लिए (Date वस्तुओं के लिए जैसे ToPrimitive आपरेशन व्यवहार) है के लिए में एक "सामान्य" मामला हो जाता है:

इसके अलावा भाषा लाभ और अधिक सुविधाओं के रूप में नियम भी अधिक से अधिक जटिल हो जाएगा ES6 (जहां ToPrimitive अनुकूलित किया जा सकता है)।

यह सुनिश्चित नहीं है कि यह "सामान्यीकरण" कुछ खुश होने के लिए है ... असली समस्या जमे हुए शुरुआती बिंदु है और अब कोई आसान समाधान नहीं है (यदि आप सभी मौजूदा जावास्क्रिप्ट कोड को फेंकना नहीं चाहते हैं, अर्थात्)।

एक भाषा के लिए सामान्य मार्ग स्वच्छ और अच्छा और सममित और छोटा शुरू हो रहा है। फिर वास्तविक दुनिया की समस्याओं का सामना करते समय भाषा के लाभ (कुछ संक्रमित होते हैं) कुछ बदसूरत हिस्सों (क्योंकि दुनिया बदसूरत और असममित है)।

जावास्क्रिप्ट इस तरह है। सिवाय इसके कि यह अच्छा और साफ शुरू नहीं हुआ और इसके अलावा गेम में इसे फेंकने से पहले इसे पॉलिश करने का कोई समय नहीं था।

नीचे एक नंबर और स्ट्रिंग की तुलना है:

+1

'==' के साथ उदाहरण भयानक है:' == 'कई भाषाओं में संक्रामक नहीं है (यहां तक ​​कि संकलित में भी)। – zerkms

+3

यह एक बहुत ही राय और व्यक्तिपरक प्रतिक्रिया है, यह वास्तव में सिर्फ एक लंबी टिप्पणी है। मुझे लगता है कि आपने जावास्क्रिप्ट के पूरे बिंदु को एक सरल, उपयोग में आसान स्क्रिप्टिंग भाषा के रूप में याद किया है जिसमें '==' ऑपरेटर जैसी सुविधाएं समझ में आती हैं (उदा। इसलिए '' 1 '== 1')। – RobG

+1

@RobG: '==' नियम जावास्क्रिप्ट को उपयोग करने में आसान नहीं बनाते हैं, असल में यह विपरीत है। आप उन कार्यक्रमों के साथ समाप्त होते हैं जो कभी-कभी काम करते हैं और कुछ समय के लिए स्पष्ट रूप से कोई कारण नहीं है। वैसे भी '1'' [1] 'और' "1" '(अंत में खाली) के बराबर है।लेकिन '[1]' '1" 'के बराबर नहीं है। नियम बिल्कुल सरल नहीं हैं, लेकिन काफी दृढ़ और अजीब (कुछ मज़े के लिए ecmascript औपचारिक मानक की जांच करें) ... वे केवल प्रारंभिक हैक का औपचारिकरण होने के लिए होते हैं। एक हैक होने के लिए प्रभावशाली, लेकिन अभी भी एक गैर अच्छी तरह से तर्क दिया हैक। – 6502

0

अपने प्रश्न के बारे में 0=='' सच लौटने का उत्तर देने के

बराबर ऑपरेटर (==)

Type (x) Type(y)    Result 
------------------------------------------- 
x and y are the same type  Strict Equality (===) Algorithm 
Number String     x == toNumber(y) 

और toNumber स्ट्रिंग तर्क के लिए निम्नलिखित करता है:

toNumber: 

Argument type Result 
------------------------ 
String   In effect evaluates Number(string) 
       “abc” -> NaN 
       “123” -> 123 

Number('')0 देता है। ताकि 0==0 जो सख्त समानता (===) एल्गोरिथ्म

सख्त का उपयोग कर मूल्यांकन किया जाता है के साथ छोड़ देता है ऑपरेटर (===)

Type   values      Result 
---------------------------------------------------------- 
Number  x same value as y    true 
      (but not NaN) 

आप पूरी सूची @javascriptweblog.wordpress.com - truth-equality-and-javascript पा सकते हैं बराबर होती है।

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