Почему нет копии объекта

  1. Тут arr не изменяется т.к. в функции параметр arr а значит будут создана локальная копия объекта который возвращается верно ?

function filterRange(arr, a, b) {
  // добавлены скобки вокруг выражения для улучшения читабельности
  return arr.filter(item => (a <= item && item <= b));
}

let arr = [5, 3, 8, 1];

let filtered = filterRange(arr, 1, 4);

console.log( filtered ); // 3,1 (совпадающие значения)

console.log( arr ); // 5,3,8,1 (без изменений)

function filterRangeInPlace(arr, a, b) {

  for (let i = 0; i < arr.length; i++) {
    let val = arr[i];

    // удалить, если за пределами интервала
    if (val < a || val > b) {
      arr.splice(i, 1);
      i--;
    }
  }

}

let arr = [5, 3, 8, 1];

filterRangeInPlace(arr, 1, 4); // удалены числа вне диапазона 1..4

alert( arr ); // [3, 1]

  1. Почему тогда здесь не работает так ?

Ответы (1 шт):

Автор решения: vsemozhebuty

Массив передаётся в функцию по ссылке — то есть копия его не создаётся, параметр ссылается на тот же самый массив. В первом случае работает потому, что метод .filter() создаёт и возвращает копию, а не меняет сам массив. Во втором случае вы уже вмешиваетесь в сам массив в цикле.

Подробнее: https://learn.javascript.ru/object-reference

→ Ссылка