2016-01-26 7 views
7

Я заметил, что если я делаю:Разница между массивом (n) и массивом (n). Заполнить?

Array(n).map(() => console.log('test')) 

Однако, если я:

Array(n).fill().map(() => console.log('test')) 

я test распечатаны n раз.

Почему это так? Если я сделаю Array(n).length, я вернусь n.

я замечаю в РЕПЛ, что Array(5) возвращается:

[ , , , , ]

принимая во внимание, Array(5).fill() возвращает:

[ undefined, undefined, undefined, undefined, undefined ]

В обоих случаях typeof любой элемент в массиве === undefined.

Итак, что происходит?

ответ

10

map работает только с определенными целыми свойствами массива. Array(n) не задает целочисленные свойства, а Array(n).fill() делает. Существует разница между a свойство, которого не существует и a свойство продолжения, значение которого undefined.

Array(n) устанавливает свойство массива length, но не задает никаких свойств. Объект массива не имеет целочисленных свойств.

.fill устанавливает все целочисленные свойства для массива от нуля до одного менее length. Когда вы делаете Array(n), вы задаете свойство нового aray length, а затем .fill() определяет и устанавливает каждое целочисленное свойство до n-1. Массив, созданный Array(n).fill()делает имеет свойства, определенные до length - 1. (Свойства случаться быть установлен в undefined, потому что вы не передать аргумент fill, но они существуют.)

В pracitcal терминах, вы можете увидеть разницу, если вы Object.keys(Array(4)) (пустой массив) по сравнению с Object.keys(Array(4).fill()) (список строк "0" - "3"). В первом случае свойства не существуют; во втором случае они это делают.

3

Array(n) создает новый массив размера n, содержимое не определено.

Array(n).fill() создает массив размером n, где каждый элемент установлен на все, что вы передали в заполнение или неопределенное в вашем случае, поскольку вы ничего не передали.

Array(n).fill('test') создает массив размером n, заполненный «тестом».

Смежные вопросы