Bunu yapabilirsiniz:
var N = 10;
Array.apply(null, {length: N}).map(Number.call, Number)
sonuç: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
veya rastgele değerlerle:
Array.apply(null, {length: N}).map(Function.call, Math.random)
sonuç: [0.7082694901619107, 0.9572225909214467, 0.8586748542729765, 0.8653848143294454, 0.008339877473190427, 0.9911756622605026, 0.8133423360995948, 0.8377588465809822, 0.55775759359511
açıklama
İlk olarak, not Number.call(undefined, N)
eşdeğerdir Number(N)
hangi sadece getiriler,N
. Bu gerçeği daha sonra kullanacağız.
Array.apply(null, [undefined, undefined, undefined])
eşdeğerdir Array(undefined, undefined, undefined)
, üç elemanlı bir dizi oluşturur veundefined
her bir öğeye .
Bunu N elementlerine nasıl genelleştirebilirsiniz ? Nasıl Array()
çalıştığını düşünün , ki böyle bir şey gider:
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'ten bu yana , Function.prototype.apply(thisArg, argsArray)
ördek parametresi olan dizi benzeri bir nesneyi ikinci parametresi olarak kabul eder. Eğer çağırırsak Array.apply(null, { length: N })
, o zaman
function Array() {
var a = [];
for (var i = 0; i < /* arguments.length = */ N; i++) {
a.push(/* arguments[i] = */ undefined);
}
return a;
}
Şimdi her elemanın ayarlanmış bir N- element dizisi var undefined
. Onu çağırdığımızda .map(callback, thisArg)
, her öğe sonucuna ayarlanacaktır callback.call(thisArg, element, index, array)
. Bu nedenle, [undefined, undefined, …, undefined].map(Number.call, Number)
her bir öğeyi daha önce gözlemlediğimiz gibi (Number.call).call(Number, undefined, index, array)
aynı olanla Number.call(undefined, index, array)
eşler index
. Bu, öğeleri dizinleriyle aynı olan diziyi tamamlar.
Neden Array.apply(null, {length: N})
sadece yerine beladan geçiyorsun Array(N)
? Sonuçta, her iki ifade de tanımsız öğelerden oluşan bir N öğeli diziye neden olur . Fark, önceki ifadede, her öğenin açıkça tanımsız olarak ayarlanmışken , son ifadede her öğenin hiçbir zaman ayarlanmamış olmasıdır. Belgelerine göre .map()
:
callback
yalnızca atanmış değerleri olan dizinin dizinleri için çağrılır; silinmiş veya hiç değer atanmamış dizinler için çağrılmaz.
Bu nedenle, Array(N)
yetersiz; Array(N).map(Number.call, Number)
başlatılmamış bir uzunluk N dizisine neden olur .
uygunluk
Bu teknik Function.prototype.apply()
ECMAScript 5'te belirtilen davranışa dayandığından, Chrome 14 ve Internet Explorer 9 gibi ECMAScript 5 öncesi tarayıcılarda çalışmaz .