আপনি এটি করতে পারেন:
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.008339877473190427, 0.9911756622605026, 0.8133423360995948, 0.837758846535935
ব্যাখ্যা
প্রথমে নোট করুন যেটি 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)
তার দ্বিতীয় প্যারামিটার হিসাবে একটি হাঁসের টাইপ অ্যারের মত বস্তু গ্রহণ করে। আমরা যদি প্রার্থনা করি 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;
}
এখন আমাদের একটি এন- এলিমেন্ট অ্যারে রয়েছে, প্রতিটি উপাদান সেট করা আছে 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()
ECMAScript 5 তে বর্ণিত আচরণের উপর নির্ভর করে , তাই এটি Chrome- 14 এবং ইন্টারনেট এক্সপ্লোরার 9 এর মতো প্রাক-ECMAScript 5 ব্রাউজারগুলিতে কাজ করবে না ।