2016-01-21 10 views
7

मैं अजीब व्यवहार (क्रोम पर परीक्षण)(नई सरणी (x)) मानचित्र stranges

[1,2].map(function() { console.log(arguments); }) 
// [1, 0, Array[2]] 
// [2, 1, Array[2]] 
// [undefined, undefined] 

और कहा कि ठीक है मिला - प्रलेखन में के रूप में ठीक लेकिन

(new Array(20)).map(function() { console.log(arguments); }) 
//[undefined × 20] 

यह नहीं करता है ' कॉलबैक का उपयोग नहीं करें (कोई क्रिया नहीं, debugger अंदर काम नहीं करता है आदि)। क्यूं कर??

सिंटेक्स new Array(arrayLength) दिया लंबाई के साथ सरणी बनाना चाहिए। और यह करता है। लेकिन .map के साथ क्या?

उत्तर

8

MDN से:

कॉलबैक केवल सरणी जो अपरिभाषित सहित मूल्यों, सौंपा है की अनुक्रमणिका के लिए शुरू हो जाती है। यह सरणी के लापता तत्व (जो है, अनुक्रमित किया है कि निर्धारित किया गया कभी नहीं है, जो किया गया नष्ट कर दिया या जो एक मूल्य आवंटित किया गया कभी नहीं किया है है) के लिए बुलाया नहीं है।

जब आप एक सरणी new Array() का उपयोग कर की घोषणा, सभी तत्वों का अपरिभाषित हैं, लेकिन वे सौंपाundefined एक मूल्य के रूप में नहीं किया गया है। इसलिए, उन्हें कॉल में map() पर छोड़ दिया गया है।

आप join() और split() उपयोग कर सकते हैं स्पष्ट रूप से प्रत्येक तत्व को undefined आवंटित करने के लिए, और आप तो अपेक्षित आउटपुट मिल जाएगा:

(new Array(20).join(undefined).split(undefined)).map(function() { console.log(arguments); })

+1

हेहे .. तुम मुझे यह करने के लिए हराया: -) – Amit

+0

ईएस 6 में अधिक सुरुचिपूर्ण: '[... ऐरे (20)]। नक्शा (फ़ंक्शन (... तर्क) {console.log (args);})' – nils

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