आप ऐसा कर सकते हैं:
var N = 10;
Array.apply(null, {length: N}).map(Number.call, Number)
परिणाम: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
या यादृच्छिक मूल्यों के साथ:
Array.apply(null, {length: N}).map(Function.call, Math.random)
रिजल्ट: [0.7082694901619107, 0.9572225909214467, 0.8586748542729765, 0.8653848143294454, 0.00833987747313190427, 0.9911756622605026, 0.8133423360995948, 0.8377588465465465865865865865465822465865465865465865465465865465465865465465465465465656546546546546546546546546565654
व्याख्या
पहले, ध्यान दें कि Number.call(undefined, N)
इसके बराबर है Number(N)
, जो सिर्फ रिटर्न देता है N
। हम बाद में उस तथ्य का उपयोग करेंगे।
Array.apply(null, [undefined, undefined, undefined])
के समतुल्य है Array(undefined, undefined, undefined)
, जो तीन-तत्व ऐरे का निर्माण करता है undefined
और प्रत्येक तत्व को असाइन करता है।
आप इसे एन तत्वों के लिए कैसे सामान्य कर सकते हैं ? विचार करें कि कैसे Array()
काम करता है, जो कुछ इस तरह से होता है:
function Array() {
if ( arguments.length == 1 &&
'number' === typeof arguments[0] &&
arguments[0] >= 0 && arguments &&
arguments[0] < 1 << 32 ) {
return [ … ]; // array of length arguments[0], generated by native code
}
var a = [];
for (var i = 0; i < arguments.length; i++) {
a.push(arguments[i]);
}
return a;
}
ECMAScript 5 के बाद से , Function.prototype.apply(thisArg, argsArray)
इसके दूसरे पैरामीटर के रूप में एक duck-typed सरणी जैसी ऑब्जेक्ट को भी स्वीकार करता है। यदि हम आह्वान करते हैं Array.apply(null, { length: N })
, तो यह निष्पादित करेगा
function Array() {
var a = [];
for (var i = 0; i < /* arguments.length = */ N; i++) {
a.push(/* arguments[i] = */ undefined);
}
return a;
}
अब हमारे पास एक N -मेंट सरणी है, जिसमें प्रत्येक तत्व सेट है undefined
। जब हम इस पर कॉल .map(callback, thisArg)
करते हैं, तो प्रत्येक तत्व के परिणाम पर सेट हो जाएगा callback.call(thisArg, element, index, array)
। इसलिए, [undefined, undefined, …, undefined].map(Number.call, Number)
प्रत्येक तत्व को मैप करेगा (Number.call).call(Number, undefined, index, array)
, जो कि जैसा है Number.call(undefined, index, array)
, जैसा कि हमने पहले देखा था, उसका मूल्यांकन करता है index
। वह एरे को पूरा करता है जिसके तत्व उनके सूचकांक के समान हैं।
Array.apply(null, {length: N})
सिर्फ के बजाय मुसीबत से क्यों गुजरें Array(N)
? आखिरकार, दोनों अभिव्यक्तियों में अपरिभाषित तत्वों का एक एन-कोड सरणी होगा। अंतर यह है कि पूर्व अभिव्यक्ति में, प्रत्येक तत्व स्पष्ट रूप से अपरिभाषित करने के लिए सेट है, जबकि बाद वाले में, प्रत्येक तत्व कभी भी सेट नहीं किया गया था। के प्रलेखन के अनुसार .map()
:
callback
केवल उसी सरणी के अनुक्रमित के लिए लागू किया जाता है जिसने मान निर्दिष्ट किए हैं; यह उन अनुक्रमणिकाओं के लिए लागू नहीं किया गया है जिन्हें हटा दिया गया है या जिन्हें कभी मान निर्दिष्ट नहीं किए गए हैं।
इसलिए, Array(N)
अपर्याप्त है; Array(N).map(Number.call, Number)
लंबाई का एक अप्रारंभीकृत सरणी में परिणाम होगा एन ।
अनुकूलता
चूंकि यह तकनीक Function.prototype.apply()
ईसीएमएस्क्रिप्ट 5 में निर्दिष्ट व्यवहार पर निर्भर करती है , इसलिए यह क्रोम 14 और इंटरनेट एक्सप्लोरर 9 जैसे प्री-ईसीएमएस्क्रिप्ट 5 ब्राउज़र में काम नहीं करेगा ।