2015-02-09 12 views
9

वास्तव में क्या बीच का अंतर है:अंतर (शून्य, सरणी (x)) और सरणी (एक्स)

Array(3) 
// and 
Array.apply(null, Array(3)) 

पहले रिटर्न [undefined x 3] जबकि दूसरा रिटर्न [undefined, undefined, undefined]। दूसरा Array.prototype.functions जैसे .map के माध्यम से श्रृंखला योग्य है, लेकिन पहला नहीं है। क्यूं कर?

+0

'Array.apply (शून्य, सरणी (9))' * नहीं * 'नई सरणी (9) '। यह 'एरे (9)' को 'एरे()' में नौ पैरामीटर के रूप में फैला रहा है। यहां तक ​​कि अगर यह काम करता है तो यह गलत तरीका है। उदाहरण के लिए आप 'नया ऐरे (1e7) 'कर सकते हैं लेकिन' Array.apply नहीं (शून्य, ऐरे (1e7)) '। – Sheepy

+1

संबंधित: http://stackoverflow.com/questions/22949976/why-does-array-applynull-args-act-inconsistently-when-dealing-with-sparse-a – Sheepy

उत्तर

13

एक अंतर है, काफी महत्वपूर्ण है।

Array निर्माता या तो, एक ही नंबर को स्वीकार करता है सरणी के लंबाई दे रही है, और "खाली" सूचकांक के साथ एक सरणी बनाया जाता है, या अधिक सही ढंग से लंबाई सेट कर दिया जाता है, लेकिन वास्तव में सरणी शामिल नहीं है कुछ भी

Array(3); // creates [], with a length of 3 

जब केवल तर्क के रूप में एक संख्या के साथ सरणी निर्माता बुला, आप एक सरणी है कि खाली है बनाते हैं, और है कि हमेशा की तरह सरणी के तरीकों के साथ दोहराया नहीं जा सकता है।

या ... सरणी निर्माता, कई तर्क को स्वीकार करता है, जबकि एक सरणी जहां प्रत्येक तर्क सरणी में एक मूल्य है बनाई गई है

Array(1,2,3); // creates an array [1,2,3] etc. 

जब आप इस

Array.apply(null, Array(3)) 
फोन

यह थोड़ा और दिलचस्प है।

apply पहले तर्क के रूप में this मूल्य स्वीकार करता है, और के रूप में यह यहाँ उपयोगी नहीं है, यह null

दिलचस्प हिस्सा दूसरा तर्क है, जहां एक खाली सरणी में पारित किया जा रहा है पर सेट है।
apply के रूप में एक सरणी यह ​​

Array(undefined, undefined, undefined); 

बुला तरह स्वीकार करेंगे और तीन सूचकांकों कि खाली नहीं है के साथ एक सरणी बनाता है, लेकिन मूल्य है, जो है यह क्यों ca वास्तव में undefined लिए निर्धारित किया है एन पुनरावृत्त हो।

टी एल; डॉ
मुख्य अंतर यह है कि Array(3) तीन सूचकांकों कि खाली हैं के साथ एक सरणी बनाता है। वास्तव में, वे वास्तव में मौजूद नहीं हैं, सरणी की लंबाई है।

apply का उपयोग कर सरणी निर्माता को खाली सूचकांक के साथ इस तरह एक सरणी में पासिंग Array(undefined, undefined, undefined); है, जो तीन undefined सूचकांक के साथ एक सरणी बनाता कर के रूप में ही है, और undefined वास्तव में एक मूल्य है, इसलिए इसे पहले की तरह खाली नहीं कर रहा है उदाहरण।

map() जैसे ऐरे विधियां केवल वास्तविक मानों पर ही वास्तविक मूल्यों को पुन: सक्रिय कर सकती हैं, खाली सूचकांक नहीं।

0

क्योंकि पहले सरणी ने arr[0] === undefined गुणों का आदेश नहीं दिया होगा और दूसरा करता है।एरे और फ़ंक्शन जैसे ऐरे फ़ंक्शन 0 से सरणी की लंबाई में पुनरावृत्त हो जाएंगे - 1 और पहले के गुणों के क्रम की कमी एक मुद्दा है। दूसरे संस्करण के रूप में आप गौर नहीं करता है सही आदेश देने के साथ एक सरणी है, यानी

arr = Array.apply(null, Array(3)); 
arr[0] === undefined //true 
arr[1] === undefined //true 
//etc. 

पहले संस्करण पैदा करता है। इसके अलावा, पहले संस्करण में new जोड़कर यह काम नहीं करेगा।

11

.map() एपीआई पूरी तरह से अनियंत्रित सरणी तत्वों पर पुनरावृत्ति नहीं करता है। जब आप new Array(n) कन्स्ट्रक्टर के साथ एक नई सरणी बनाते हैं, तो आपको .length के साथ एक सरणी मिलती है जिसे आपने पूछा था, लेकिन अस्तित्वहीन तत्वों के साथ जिन्हें .map() जैसी विधियों से छोड़ा जाएगा।

अभिव्यक्ति Array.apply(null, Array(9))undefined के साथ नव निर्मित बनाए गए सरणी उदाहरण को स्पष्ट रूप से पॉप्युलेट करता है, लेकिन यह काफी अच्छा है। यह चाल है कि in ऑपरेटर रिपोर्ट करेगा कि सरणी में दिए गए इंडेक्स में एक तत्व होता है। यही कारण है:

var a = new Array(9); 
alert(2 in a); // alerts "false" 

ऐसा इसलिए है क्योंकि वहाँ वास्तव में सरणी में स्थिति 2 में कोई तत्व है। लेकिन:

var a = Array.apply(null, Array(9)); 
alert(2 in a); // alerts "true" 

ऐरे कन्स्ट्रक्टर को बाहरी कॉल स्पष्ट रूप से तत्वों को आबादी देगा।

+0

उत्तर के लिए धन्यवाद, मुझे वास्तव में यकीन नहीं था कि प्रत्येक स्लॉट में 'इन' क्या था, वह मान के समान नहीं था, क्योंकि किसी दिए गए स्थान में अनुक्रमणित अपरिभाषित होता है। –

+1

@ mb_s88 ऐरे में 9 0 मानें (9); // false' –

+0

@ mb_s88 उत्तर थोड़ा सा – Pointy

3

यह कामों का एक आर्टिफैक्ट है। जब आप ऐसा करेंगे:

new Array(9) 

एक खाली सरणी 9. नक्शा न के बराबर सदस्यों की यात्रा नहीं करता है की लंबाई के साथ बनाया जाता है, तो कुछ भी नहीं करता है। हालांकि, apply का उपयोग कर CreateListFromArrayLike तो यह की तरह एक पैरामीटर सूची में पूर्व में खाली सरणी बदल जाता है एक सूची में सरणी बदल जाता है:

[undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined]; 

कि सरणी में भेजा जाता है 9 सदस्यों के साथ एक सरणी बनाने के लिए, एक मूल्य के साथ सभी अपरिभाषित। तो अब नक्शा उन सभी का दौरा करेगा।

Btw, ECMAScript 2015 इस के लिए Array.prototype.fill (भी MDN देखें) ताकि आप कर सकते हैं:

Array(9).fill(0); 
संबंधित मुद्दे