Если вы хотите лучше понять объекты, массивы и их ссылки и создать их копию, то вы попали по адресу.
Javascript Objects
и Arrays
являются изменяемыми, что означает, что их состояние может быть изменено после его создания. Objects
и arrays
сравниваются по ссылкам, а не по значениям, в отличие от типов string
и number
. Если они не обрабатываются тщательно и состояние не поддерживается должным образом, существует большая вероятность того, что вы сильно испортите свое приложение.
Существует несколько способов копирования массивов и объектов, чтобы иметь ссылки, отличные от их исходного объекта. Копирование массива, скажем, из 100000
объектов будет чертовски дорого.
Здесь мы поговорим о нескольких методах правильного клонирования объектов/массивов и о лучшем способе копирования файла Array of Objects
.
Клонирование объекта
Способ ES6:
const originalObj = { name: 'cloning' }; const clonedObj = Object.assign({}, obj); originalObj === clonedObj //false
Или вы можете просто использовать оператор spread
const originalObj = { name: 'cloning' }; const clonedObj = {...obj}; originalObj === clonedObj //false
Клонирование массива
Способ ES5:
const originalArr = ['a', 'b', 'c']; const clonedArr = originalArr.slice(0); // slice with index is FASTER originalArr === clonedArr // false
Способ ES6:
const originalArr = ['a', 'b', 'c']; const clonedArr = [...originalArr]; originalArr === clonedArr // false
Клонирование с использованием объекта JSON
const originalArr = ['a', 'b', 'c']; const clonedArr = JSON.parse(JSON.stringify(originalArr)); originalArr === clonedArr // false const originalObj = { name: 'cloning' }; const clonedObj = JSON.parse(JSON.stringify(originalObj)); originalObj === clonedObj //false
Однако клонирование с использованием JSON
методов — достаточно затратная операция.
Клонировать массив объектов просто и легко, но большую часть времени мы забываем тот факт, что клонирование только массива (который содержит объекты) не приводит к глубокому клонированию, и объекты в новом массиве по-прежнему ссылаются на те же старые объекты.
Пример:
const arrayObj = [{name: 'clone'}, {name: 'array'}, {name: 'object'}]; const copy = [...arrayObj]; copy === arrayObj // false copy[0] === arrayObj[0] //true
Есть несколько способов сделать это, но большинство из них неэффективны и могут полностью испортить ваше приложение. Самый простой и часто используемый среди разработчиков метод — использование методов JSON
, который, по-видимому, является самым медленным методом из всех. Я протестировал несколько часто используемых методов для клонирования и копирования массивов и объектов, и ниже приведены результаты с размером выборки массива с 10000
объектами из 1
пары ключ-значение в каждом.
Может быть много других способов выполнить точную операцию, но во всех тестах, которые я тестировал, я обнаружил, что Map with Spread Operator
показал лучшую производительность, чем другие способы.
Надеюсь, это полезно. Если у вас остались вопросы к концу этого поста, дайте мне знать, чтобы я мог улучшить эту статью.