type
Чувствительная к регистру строка, представляющая тип прослушиваемого события.
['click', 'mouseover']. map(type => document.querySelector('.o').addEventListener(type, (event)=> {
console.log(event.type, document.querySelector('.o').textContent);
}))
1. Короче (имеется ввиду map короче, чем forEach).а заодно выполняет гораздо больше действий под капотом, среди которых создание нового массива исходного размера, а значит дополнительные аллокации/резервирования памяти и приближение такта сборки мусора.
2. Замыкания и безопасность исходного массива (чтобы внутри цикла не изменить случайно элементы массива, если это массив не просто скаляров, а объектов).Вообще бред. forEach не мутирует исходный массив и замыкание точно такое же делает. В чем безопасность то выше у map?
3. Изменчивость
map() возвращает совершенно новый массив с преобразованными элементами и тем же количеством данных. В случае forEach(), даже если он вернется undefined, он изменит исходный массив с помощью callback.
Поэтому что map() опирается на неизменность и forEach() является мутатором.
как и назвать некий проект своим, сделав одноименный репо на гитхабе, который к тому же "forked from prisma-cms/nextjs" и самый старый коммит в котором датируется 11 октября 2020...
Кстати, натыканный наугад "урок": https://freecode.academy/learn/exercises/587d7b7b3...
И у меня уже сочувствие, к тем кто по этому так сказать материалу будет учится...
А можно воспроизводимый пример, как forEach мутирует массив, а не статью ноунейма с ресурса где любой студент может писать статьи для зачета?
arr = [1,2,3]
arr.forEach((val, index, scope) => {
scope[index] = val * 2;
})
console.log(arr);
// 2,4,6
["1", "2", "3"].forEach((el, i, arr) => {const a=arr.splice(0, 1); console.log(a,arr);})
elem.addEventListener('mouseover', event=> {
func();
})
elem.addEventListener('click', event=> {
func();
})
WbICHA, я бы еще добавил, что создание функции нужно выносить за цикл, а не плодить миллион однотипных
map() возвращает совершенно новый массив с преобразованными элементами и тем же количеством данных. В случае forEach(), даже если он вернется undefined, он изменит исходный массив с помощью callback.
Поэтому что map() опирается на неизменность и forEach() является мутатором.
Вероятнее всего имелось ввиду, что если вы захотите как-то повлиять намассив, то вы обязательно измените исходный. А если не хотите его менять, то надо сначала объявить новый результирующий массив, чтобы его передать как параметр, и в него уже пушить новые элементы.
В данном случае нет разницы что использовать.
В ДАННОМ случае нет разницы
Объект, это ссылочный тип
Нет смысла заниматься оптимизацией прохода списка из 2-3 элементов
разве движок это не оптимизирует?
Set<EventListener>
под капотом, поэтомуfor(let i = 0; i < 10; i++) {
node.addEventListener('event', () => {});
}
сожрет в 10 раз больше памяти, чемconst f = () => {};
for(let i = 0; i < 10; i++) {
node.addEventListener('event', f);
}
Не говоря уж о том, что каждая из этих функций компилируется и оптимизируется по отдельности.К примеру, так:
arr = [1,2,3]
arr.forEach((val, index, scope) => {
scope[index] = val * 2;
})
console.log(arr);
// 2,4,6
const arr = [1,2,3]
arr.map((val, index, scope) => {
scope[index] = val * 2;
});
console.log(arr); // 2,4,6
const f = (a, b, e) => { ... };
// loop
.addEventListener('click', f.bind(null, 1, 2));
const f = (a, b) => (e) => { ... };
// loop
.addEventListener('click', f(1, 2));
{ ... }
и сложнее ли оно, чем внутренности bind, с которым вообще не просто это посчитать, так как в последних версиях v8 все встроенные функции переписаны с js на torque (свой яп v8, помесь js и плюсов и компилируемый в плюсы).const f = (e, a, b) => { ... };
// loop
.addEventListener('click', e => f(e, 1, 2));
Так наплодим функций из единственного call expression, а все остальное вынесем в единственную f.