@montecazazza
Node, GraphQL, React

Почему Array(10).map(...) не работает?

Создаем массив определенной размерности через
const arr1 = Array(n);
// или
const arr2 = [];
arr2.length = 10;

// массив создан, его размер мы можем получить и все ОК
// arr1.length => 10
// arr2.length => 10

// однако, методы forEach, map, reduce, filter и пр на массиве не работают
// тоесть переданная функция не выполняется
// хотя никакой ошибки тоже нет

arr1.forEach((el, idx) => {
  console.log('In forEach');
}); // => ничего

// в цикле все ок, размерность есть
for(let i = 0, j = arr1.length; i < j; i++) {
  console.log('In loop');
}

С чем связано такое поведение?
Я не знаю как конкретно реализованы эти методы в JS, посмотреть тоже не получается,
кто-нибудь знает как вывести текст нативной функции?
console.log(Array.prototype.map.toString()) // => function map() { [native code] }
  • Вопрос задан
  • 443 просмотра
Решения вопроса 1
@napa3um
Конструкция Array(n) создаёт так называемый разрежённый массив, некоторые элементы которого (в данном случае - все) могут быть незаполненными. В такие элементы итератор не заходит. Чтобы зашёл, нужно эти элементы чем-то заполнить, например:

Array(5).fill(undefined).forEach(val => console.log(val)) // undefined и незаполненность - разные вещи!
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
devellopah
@devellopah
arr1.fill().forEach((el, idx) => {
  console.log(idx, el);
});

------------------------------------
Под капотом (не точно)

forEach
function forEach(arr, fn) {
	var i, len = arr.length;
	
	for(i = 0; i < len; i++) {
		fn(arr[i], i, arr);
	}
}


map

function map(arr, fn) {
	var i, len = arr.length, result = [];
	
	for(i = 0; i < len; i++) {
		result.push(fn(arr[i], i, arr));
	}
	
	return result;
}


как видишь под капотом всё "как обычно". То есть эти методы всего лишь декларативные обёртки поверх всё того же императивного кода. Другими словами, ты не говоришь "как делать", но говоришь "что делать".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы