2015-09-01 10 views
20

0 की सरणी बनाने के लिए कुछ कोड के साथ खेल रहा था और पाया कि केवल एक मान NaN0 के बजाय वापस कर दिया गया था। मुझे यह क्रोम, नोड और फ़ायरफ़ॉक्स में मिलता है।NaN असंगत रूप से मैपिंग पार्सिंग

दूसरा मान NaN होने का कारण क्या है? मूल्य, और सूचकांक (तीसरे सरणी ही है):

var arr = new Array(32).join(0).split('').map(parseInt) 
// prints [0, NaN, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
console.dir(arr) 
+3

क्या आपने 'नया ऐरे (32) .फिल (0);'? –

+1

आपको रुचि हो सकती है [शून्य भरे हुए जावास्क्रिप्ट सरणी बनाने के लिए सबसे प्रभावी तरीका?] (Http://stackoverflow.com/q/1295584/1529630) – Oriol

उत्तर

27

क्योंकि समारोह map के लिए पारित किया तीन तर्कों के साथ कॉल किया जाएगा कि:

  1. वर्तमान सरणी आइटम
  2. है कि आइटम
  3. पूरे सरणी

इस मामले में के सूचकांक, कि समारोह, parseInt है जो केवल दो तर्क का उपयोग करता है:

  1. स्ट्रिंग को पार्स किया जाना
  2. रेडिक्स पार्स के लिए उपयोग किया जाता है ई स्ट्रिंग
  3. अतिरिक्त तर्कों को अनदेखा कर दिया जाएगा।

इसलिए, सरणी में दूसरे आइटम के लिए (यानी।आर = ToInt32 (मूलांक)

  • करते हैं: सूचकांक 1), कॉल हो जाएगा

    parseInt("0", 1, ignoredArray) 
    

    जब मूलांक 1 है, NaN दिया जाता है।

  • तो आर ≠ 0, तो
    • तो आर < 2 या आर> 36, तो NaN लौट आते हैं।

यह भी ध्यान रखें कि यदि आप new Array(99) की तरह एक बड़ी संख्या के लिए इस्तेमाल किया है, तो आप देखा होगा NaN रों सूचकांक पर शुरू 37.

+0

और अभी तक 0 मान्य रेडिक्स है? – immibis

+0

अगर पूर्णांक तारों की एक सरणी को पार्स करने की वास्तविक आवश्यकता थी, तो सबसे सरल समाधान 'parseFloat' का उपयोग करना है, जो केवल एक तर्क लेता है। – Mihai

+0

@immibis गणितीय रूप से 0 रेडिक्स कोई समझ नहीं आता है। इसलिए, यदि आप 0 का उपयोग करते हैं, तो जेएस आपको अनुमान लगाएगा 10. – Oriol

9

.map() समारोह कॉलबैक जिनमें से दो parseInt() द्वारा किया जाता है करने के लिए तीन तर्क गुजरता है। जब सूचकांक 1 है, तो अंकों की कोई भी स्ट्रिंग एक अवैध मान होगी। parseInt() फ़ंक्शन दूसरे तर्क को अनदेखा करता है जब यह 0 है।

विस्तार करने के लिए: पहले तत्व के लिए, parseInt() इस तरह कहा जाता है:

parseInt("0", 0) 

क्योंकि सरणी मान शून्य है और सूचकांक शून्य है। दूसरी कॉल पर यह इस प्रकार है:

parseInt("0", 1) 

और उस NaN देता है।

नोट यदि आप परिणामों सभी पूर्णांकों होने के बारे में भी picky नहीं कर रहे हैं, क्या आप संख्या निर्माता के साथ क्या करने की कोशिश कर रहे हैं क्या कर सकते हैं कि:

var arr = new Array(32).join(0).split('').map(Number); 

ES2015 में (के लिए नवीनतम पुष्टि की मानक जावास्क्रिप्ट है, जो अगर हम सब बहुत अच्छा पूरी तरह से हमारे क्रिसमस उपहार के रूप में सभी ब्राउज़रों) में लागू किया जाएगा रहे हैं आप .fill() फ़ंक्शन का उपयोग कर सकते हैं:

var arr = new Array(31).fill(0); 
+6

[** तीन ** तर्क] (https: // डेवलपर। mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map), तीसरा सरणी है जिसे आप मैप कर रहे हैं। 'parseInt' तीसरे को अनदेखा करता है। – user2357112

+0

@ user2357112 हाँ यह सच है, और हां 'parseInt' केवल अपने पहले दो तर्कों को देखता है। – Pointy

6

मानचित्रण अपने कार्य करने के लिए तीन तर्क गुजरता है:

  • तत्व;
  • सरणी के भीतर उस तत्व की अनुक्रमणिका; और
  • सरणी स्वयं ही।

parseInt समारोह उन के पहले दो को देखो, सही ढंग से पहले इलाज स्ट्रिंग के रूप में लेकिन आधार का उपयोग करने के रूप में दूसरा इलाज होगा। जब आधार न तो शून्य होता है और न ही समावेशी रेंज 2..36 में, यह NaN(1) देता है। आप चालीस तत्वों के साथ एक सरणी था, तो आप भी अंत में NaN मूल्यों का एक समूह देखना चाहते हैं:

0, NaN, 0, 0, 0, ... 0, 0, 0, NaN, NaN 

तुम भी कुछ बहुत अजीब परिणाम प्राप्त होता है, तो संख्या तार शून्य के अलावा और कुछ थे, के बाद से सरणी सूचकांक यह निर्धारित करेगा कि इसका आधार किस आधार पर उपयोग किया गया था।

वास्तव में ठीक इस, तो आप सिर्फ एक समारोहparseIntक्या उम्मीद में अनुवाद करेंगे कि क्या mapआप देता है प्रदान कर सकते हैं करने के लिए (एक नक्शा नक्शा, मुझे लगता है कि आप इसे कह सकते हैं):

function myParseInt(s,r,a) { return parseInt(s,10); } 
var arr = new Array(32).join(0).split('').map(myParseInt) 
alert(arr) 

आप इस सरणी को बनाने के तरीके को भी देखना चाहते हैं, यह वास्तव में 32 के बजाय आकार 31 की सरणी के रूप में समाप्त हो जाएगा। यदि आप बस '0' वर्णों की एक सरणी चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

var arr = new Array(32).fill('0') 

मानते हैं कि आपके पास ऐसा ब्राउज़र है जो ECMAScript 2015 का समर्थन करता है, जो इस उत्तर के समय सफारी, फ़ायरफ़ॉक्स और क्रोम-डेस्कटॉप है।


(1) शून्य होने का आधार हेक्स उपसर्गों जैसी चीजों से निपटने के लिए डिफ़ॉल्ट मामला है।

एक का आधार पूरी तरह से स्थितित्मक प्रणाली में कोई समझ नहीं आता है (जहां प्रत्येक अंक आधार की शक्ति से गुणा किया जाता है और संचित) क्योंकि केवल स्वीकृत अंक 0 होगा, इसलिए प्रत्येक स्थान मान शून्य गुणा होगा 1n द्वारा। दूसरे शब्दों में, बेस-वन सिस्टम में केवल एक ही संख्या शून्य होगी।

2 से 36 के आधार अधिक समझदार हैं।

+0

आप कहते हैं कि आधार 1 संभव नहीं है क्योंकि केवल संख्या '1^n' होगी, वास्तविकता आधार 1 में संख्या के रूप में कई अंक हैं (यानी '30' = '1 ....... 1' तीस बार)। आधार 1 संख्याओं पर संचालन बहुत लंबा है, विशेष रूप से आधार 1 संख्या को मुद्रित करने के लिए बहुत बड़ी संख्या में प्रिंटिंग की आवश्यकता हो सकती है जो बहुत जानकारीपूर्ण नहीं है। यह निश्चित रूप से एक सम्मेलन है और ऐसे प्रमेय भी हैं जिन्हें बेस 1 को साबित करने की आवश्यकता होती है (यानी एक 3 रजिस्टर्स मशीन पूर्ण हो रही है) – GameDeveloper

+1

@DarioOO, बेस 1 में केवल अंक '0' (' 1' नहीं) है, जैसा कि बेस 2 में केवल '0' और' 1' है। पूरी तरह से स्थितित्मक प्रणाली में, '0' * केवल * शून्य उत्पन्न कर सकता है क्योंकि किसी दिए गए स्थान' n' का मान '0 x 1^n' होगा। दूसरे शब्दों में '00000 ... 000' शून्य है कोई फर्क नहीं पड़ता * कैसे * आपके पास कितने अंक हैं। आधार 1 गैर-स्थितित्मक प्रणाली के लिए व्यवहार्य हो सकता है, इसलिए मैं इसे स्पष्ट कर दूंगा कि मेरा मतलब यही था। – paxdiablo

+0

ऐसा इसलिए है क्योंकि आप बेस 2 + संख्याओं के लिए उपयुक्त परिभाषा का विस्तार करते हैं, यह परंपरागत रूप से 1 से 0 के 0 से बना नहीं है: https://en.wikipedia.org/wiki/Unary_numeral_system यह आधार के लिए एकमात्र परिभाषा नहीं है एक संख्या, वहां सामान्य परिभाषाएं मौजूद हैं जिनके पास असंबद्ध आधार है। – GameDeveloper

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