Вопрос проверяет понимание побочных эффектов и мутабельности данных, что критично для написания предсказуемого и поддерживаемого кода.
Изменение входных аргументов функции напрямую — это классический пример создания побочного эффекта (side effect). Функция, которая модифицирует свои параметры, перестаёт быть чистой (pure function), потому что её выполнение влияет на состояние программы за своими пределами. Это приводит к нескольким конкретным проблемам.
Рассмотрим плохую и хорошую практику на примере функции, которая должна добавить налог к ценам в массиве.
// ПЛОХО: Функция мутирует входной аргумент
function addTaxBad(prices, taxRate) {
for (let i = 0; i < prices.length; i++) {
prices[i] = prices[i] * (1 + taxRate); // Прямое изменение массива!
}
// Функция ничего не возвращает, но массив `prices` в вызывающем коде уже изменён.
}
const cart = [100, 200, 300];
addTaxBad(cart, 0.2);
console.log(cart); // [120, 240, 360] - исходный массив безвозвратно потерян.
// ХОРОШО: Функция возвращает новый массив, не трогая исходный
function addTaxGood(prices, taxRate) {
return prices.map(price => price * (1 + taxRate)); // Используем .map для создания нового массива
}
const originalCart = [100, 200, 300];
const cartWithTax = addTaxGood(originalCart, 0.2);
console.log(originalCart); // [100, 200, 300] - исходные данные целы
console.log(cartWithTax); // [120, 240, 360] - новый массив с результатомПринцип неизменяемости (immutability) является краеугольным камнем в функциональном программировании и широко используется в современных фреймворках, таких как React (для состояния) и Redux. Чтобы избежать случайных мутаций:
.map(), .filter(), spread оператор [...arr], Object.assign({}, obj) или библиотеки типа Immer).Вывод: Избегайте изменения входных аргументов функции. Это делает код более предсказуемым, упрощает тестирование и отладку, а также предотвращает сложные ошибки, связанные с общим состоянием. Применяйте этот подход везде, где важна надёжность и поддерживаемость кода, особенно при работе с коллекциями данных и состоянием приложения.