@ Арман Чаран прав в своем ответе. Объект и массивы не примитивные типы, а ссылки.
Здесь есть отличное объяснение видео => JavaScript - Ссылка против примитивных значений / типов
Таким образом, для ссылочных типов сначала необходимо клонировать ее в другую переменную, а затем изменить эту переменную без изменений, влияющих на исходные данные.
Однако для вложенных массивов и объектов высокого уровня спид и Array.from работать не будут.
Если вы используете Lodash , вы можете использовать _.cloneDeep()
для безопасного клонирования массива или объекта.
Мне нравится функциональное программирование, и я использую Lodash, который я настоятельно рекомендую.
Так что вы можете сделать:
let original_reference_type = [{ id:1 }, { id: 2 }]
let clone_original = _.cloneDeep(original_reference_type)
clone_original[0].id = "updated"
console.log(original_reference_type) //[{ id:1 }, { id: 2 }] => will not change
console.log(clone_original) // [{ id: "updated" }, { id: 2 }]
Предложение: Для простых массивов и объектов используйте:
Объекты:
let clone_original_data = {...original_data}
или
let clone_original_data = Object.assign({}, original_data)
Массивы:
let clone_original_data = [...original_data]
или
let clonse_original_data = original_data.slice()
Для сложных и высоких вложенных массивов или объектов используйте Lodash's _.cloneDeep()