Посмотрев на код javascript, я увидел (что-то вроде этого):
var arr = Array.apply(null, {length: 10});
Чтение документации MDN для функции .prototype.apply(), я узнал, что, хотя обычно он ожидает, что массив является вторым аргументом, который представляет собой массив аргументов, которые должны быть переданы вызываемой функции,
вы также можете использовать любой объект, похожий на массив, поэтому на практике это означает, что он будет иметь длину свойства и целочисленные свойства в диапазоне (0... length).
Итак, из того, что я мог сказать, он вызывал Array(), как будто ему было передано 10 аргументов, но поскольку он не определяет ни одно из этих "целочисленных свойств", он как будто он был передан 10 undefined аргументов. Правильно ли это?
console.log(arr);
дает
[undefined, undefined undefined undefined undefined undefined undefined undefined undefined undefined]
Что совершенно отличается от результата
var barr = new Array(10);
console.log(barr);
который
[,,,,,]
Эти массивы также ведут себя по-другому.
console.log(arr.map(function(item) { return 'hi';}));
console.log(barr.map(function(item) { return 'hi';}));
дает
['hi', 'hi', 'hi', 'hi', 'hi', 'hi', 'hi', 'hi', 'hi', 'hi']
[,,,,,]
Я хотел знать, почему функция карты не работает для второй. Поэтому я проверил console.log(1 in arr);
, который дал true, и `console.log(1 в barr); ' который дал false.
Итак, моя текущая догадка заключается в том, что arr - это массив, который содержит в качестве целочисленных свойств 10 переменных, каждое из которых имеет значение undefined, а barr - массив, который, хотя он имеет длину 10, не имеет целочисленных свойств. И Array.apply работает, потому что запрашивает {length: 10}, что его свойство 0, получает undefined, и поэтому присваивает undefined свойству 0 массива, которое он строит, и так далее. Правильно ли я рассуждаю? И действительно ли не менее хакерский способ определить массив, содержащий undefined целочисленные свойства для каждого индекса в пределах его диапазона, вместо того, чтобы вообще не иметь целочисленных свойств? Поскольку, глядя на это, мне кажется, что new Array()
довольно бесполезен.