2012-06-29 15 views
20

पर विचार करें:अपरिभाषित मूल्यों

var a = Array(3); 
var b = [undefined,undefined,undefined]; 

कारण यह है कि a.map और b.map भिन्न परिणाम क्या है?

a.map(function(){ return 0; }); //produces -> [undefined,undefined,undefined] 
b.map(function(){ return 0; }); //produces -> [0,0,0] 
+1

संबंधित: बाहर की जाँच अगर आप 'सेट b.length = 5 क्या होता है;' इससे पहले कि आप 'map' चलाएँ:' [0, 0, 0, अपरिभाषित, अपरिभाषित] ' – apsillers

उत्तर

23

सरणी कन्स्ट्रक्टर दी गई लंबाई के साथ एक सरणी बनाता है। यह कुंजी बनाता है। Array.prototype.map का कॉलबैक फ़ंक्शन केवल सूची में मौजूद तत्वों के लिए निष्पादित किया गया है।
है यही कारण है, सभी मूल्यों जो एक प्रमुख (पूर्णांक) के साथ जुड़े रहे 0 ≤ मैं < लंबाई। इसलिए .map के कॉलबैक शुरू हो रहा कभी नहीं है

  • Array(3), शून्य कुंजी है।
  • [void 0, void 0, void 0] में तीन कुंजी हैं, जिनके लिए कॉलबैक फ़ंक्शन निष्पादित किया गया है।

    Array(3).hasOwnProperty(0);     // false 
    [void 0, void 0, void 0].hasOwnProperty(0); // true 
    

विनिर्देश और उसके polyfill MDN में उल्लेख कर रहे हैं। लाइन 47 पर, if (k in O) { दिखाता है कि कॉलबैक फ़ंक्शन द्वारा गैर-मौजूद कुंजी का इलाज नहीं किया जाता है।

+1

वास्तव में, नक्शा पुनरावृति चाहिए चाबियों पर नहीं, लेकिन मूल्यों के अनुक्रम पर 0..array.length-1 –

+0

@ पांडा -34 0 और n के बीच छोड़ने वाली कुंजी संख्यात्मक कुंजी पर चलने के समान है। लेकिन आप सही हैं, कड़ाई से बोलते हुए, मुझे ऐसा कहना चाहिए था;) –

+0

@RobW हम मान सकते हैं कि '3' तत्वों को संग्रहीत करने के लिए 'ऐरे (3)' वास्तव में स्मृति आवंटित नहीं करता है, जो मान' अपरिभाषित 'हैं , और यह बस 'लंबाई' संपत्ति को' 3' पर सेट करता है, बस? – Engineer

4

a एक खाली सरणी तत्व नहीं है, तो नक्शा समारोह तत्वों बिना खाली सरणी का उत्पादन होता है (विनिर्देश के अनुसार, नक्शे का उत्पादन परिणाम केवल अगर [[HasProperty]] सच है।)b तीन की एक सरणी है तत्व, इसलिए नक्शा तीन तत्वों की एक सरणी पैदा करता है।

6
MDN से

:

कॉलबैक केवल सरणी जो मूल्यों सौंपा है की अनुक्रमणिका के लिए शुरू हो जाती है; यह इंडेक्स के लिए नहीं बुलाया गया है जो हटा दिया गया है या कभी मूल्यों को असाइन नहीं किया गया है।

सरणी a के लिए, आपने लंबाई 3 की सरणी को तुरंत चालू कर दिया है लेकिन किसी भी मान को असाइन नहीं किया है। नक्शा फ़ंक्शन असाइन किए गए मानों के साथ कोई तत्व नहीं पाता है, इसलिए यह एक नई सरणी उत्पन्न नहीं करता है।

सरणी b के लिए, आपने 3 तत्वों की एक सरणी को तुरंत चालू किया है, प्रत्येक मान undefined के साथ। नक्शा फ़ंक्शन को असाइन किए गए मानों के साथ 3 तत्व मिलते हैं, और '0' को नए सरणी में उनमें से प्रत्येक के लिए नए मान के रूप में लौटाता है।

3

map केवल मौजूदा गुणों को पुन: सक्रिय करता है, खाली सूचकांक नहीं।

इसलिए, यदि आप इसे काम करना चाहते हैं, तो आपको पहले सरणी भरनी होगी।apply साथ

  • .fill(), ES6 में

    console.log(new Array(3).fill().map(function(){ return 0; }));

  • कॉल concat शुरू की:

    वहाँ ऐसा करने के लिए कई तरीके हैं, उदाहरण के लिए कर रहे हैं

    var arr = [].concat.apply([], new Array(3)); 
     
    console.log(arr.map(function(){ return 0; }));

  • एक पुरानी for पाश।

    var arr = new Array(3); 
     
    for(var i=0; i<arr.length; ++i) arr[i] = 1; /* whatever */ 
     
    console.log(arr.map(function(){ return 0; }));

  • उपयोग कुछ विचार Most efficient way to create a zero filled JavaScript array?

  • वगैरह से।

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