У меня есть смутное представление о том, что означает «обеспечивать неизменяемость», когда я говорю об использовании map поверх цикла for. Потому что вызов Array.prototype.map в массиве не мешает вам изменить исходный массив. Допустим, у нас есть однопоточная асинхронная программа. В этих обстоятельствах есть ли преимущество «неизменности», которое map обеспечивает по сравнению с петлей for?
Я могу представить себе следующий код:
function A() {
const arr = [1, 2, 3, 4, 5]
const anotherArr = arr.map((e, i) => {
arr[i] = 'changed'
// here goes some asynchronous code
return e * 2
})
// now arr is ['changed', 'changed', 'changed', 'changed', 'changed']
// and anotherArr is [2, 3, 6, 8, 10]
}
function B() {
const arr = [1, 2, 3, 4, 5]
const anotherArr = []
for (let i = 0, len = arr.length; i < len; i++) {
anotherArr[i] = arr[i] * 2
arr[i] = 'changed'
// here goes some asynchronous code
}
// and again:
// now arr is ['changed', 'changed', 'changed', 'changed', 'changed']
// and anotherArr is [2, 3, 6, 8, 10]
}Я предполагаю, что, вероятно, в функции B anotherArr создается вручную перед заполнением. Следовательно, что-то в том же объеме может изменить это до завершения цикла for. Итак, мой вопрос: «Есть ли преимущество использования map по сравнению с циклом for в однопоточной асинхронной среде с точки зрения безопасности»?
Редактирование
Я перефразирую свой вопрос: «Есть ли какая-то неизменность, которую функция Array.prototype.map?
обеспечивает (поскольку принадлежит к функциональной парадигме) ».
Насколько я понимаю, функция map в javascript не связана с неизменяемостью,
речь идет о сокрытии некоторых деталей реализации (как создается результирующий массив).
Итак, функция map - это декларативный способ делать что-то. Цикл for является обязательным
способ ведения дел (который, я думаю, приносит больше свободы и больше ответственности).
Нет, разница между map и циклом for с push небезопасна. В основном читабельность.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


map, reduce, filter, forEach и т. д.
Вышеупомянутые методы, на мой взгляд, хороши для FP (функционального программирования).
Конечно, вы можете использовать их вместо обычного цикла for, но нормальный цикл for быстрее их (https://hackernoon.com/javascript-performance-test-for-vs-for-each-vs-map-reduce-filter-find-32c1113f19d7).
Так что, по моему мнению, если вам не важна производительность, используйте map, reduce и т. д. - это элегантно и получит меньший и более читаемый код.
Вы мутируете оригинал в обоих случаях, когда делаете
arr[i] = 'changed'.