Скорее всего, они называют map
"безопаснее", потому что это соответствует функциональной модели программирования.В функциональном программировании большинство, если не все, данные являются неизменяемыми;программирование - это создание новых данных на основе существующих данных, а не их изменение на месте.
Преимущества безопасности предоставляются в тех случаях, когда вы не являетесь единственным владельцем данных.Если ваша функция получает массив от вызывающей стороны, ее изменение на месте изменяет версию массива вызывающей, а не только вашу собственную (потому что они на самом деле один и тот же массив).И если они также получили его в качестве аргумента, он также меняет их массив вызывающих (потому что это все тот же массив).В конечном итоге это может привести к тому, что кто-то через двенадцать прыжков вызовет функцию со своим массивом, ожидая, что она останется неизменной, удивившись, когда она будет изменена, и не имея простого способа определить что изменило ее.
Хотя JavaScript не является функциональным языком, он предлагает функциональные парадигмы, поэтому вы можете писать в функциональном стиле.Если вы последовательны в этом, такого рода неожиданное действие на расстоянии не происходит, и вам легче рассуждать о вашем коде.
Это особенно важно для библиотек;с библиотекой вы не хотите предполагать, что вызывающая сторона не программирует функционально, поэтому, ведя себя функционально, вы избегаете риска нарушения их предположений.
Тем не менее, если выЕсли вы не используете функциональный стиль, и вы не создаете библиотеку для перераспределения, то действие на расстоянии всегда будет рискованным, а частично функциональное функционирование очень мало для вас, так что вы должны просто выбрать правильныйинструмент для работы;forEach
только для чтения или для изменения на месте, map
для создания нового массива.
Последнее замечание: теоретически, map
может сделать код быстрее, несмотря на создание новых массивов.Когда массив гарантированно будет создан и уничтожен в одной функции, оптимизатору JIT будет проще с анализом времени жизни, анализом типичного содержимого и т. Д., И он может предположительно:
- Полностью оптимизировать промежуточные массивы(пять
map
с может создать только один новый массив) - Специализировать массив по содержимому, длине и т. д. (возможно с массивами, полученными извне, но сложнее сделать последовательно)
Я бы не стал рассчитывать на такую оптимизацию с map
(не решайте, какую именно использовать на этой основе), но реальные функциональные языки получают преимущества, подобные этой, благодаря гарантиям неизменности, которые они обеспечивают, и механизмы JIT JavaScript могут воспользоватьсятех же самых «гарантий», когда они могут наблюдать, к которым они присоединяются на практике.