let obj = {key : 'Add',arr : [0,2,3]}
let obj2 = Object.assign({},obj,{arr :obj.arr})
obj2.arr.pop()
console.log(obj)
console.log(obj2)
рассмотрим вышеприведенный пример, поэтому мне нужно удалить элемент из массива obj2, тогда использование pop влияет на оба массива.
вы должны всегда parse
и stringify
объект перед созданием копии,
JSON.parse(JSON.stringify(obj.arr))
Объект всегда сохраняет ссылку, поэтому, если дочерний или родительский объект изменен, оба становятся затронутыми.
то есть если object a = object b
, то изменение object b
влияет на object a
.
let obj = {key : 'Add',arr : [0,2,3]}
let obj2 = Object.assign({},obj,{arr :JSON.parse(JSON.stringify(obj.arr))})
obj2.arr.pop()
console.log(obj)
console.log(obj2)
you should always parse and stringify object before making a copy,
нет, вы не всегда должны это делать. Вы можете сделать это, если вы хотите изменить объект, а также если объект в основном содержит примитивы помимо функций и символов. В противном случае {name: "bob", speak: () => console.log(this.name)}
уничтожит некоторые ваши данные. Если ваш объект имеет не стандартный и ненулевой прототип, вы также потеряете его.
Это потому, что вы прямо ссылаетесь на "arr" obj, который не является копией, а ссылкой на массив. Чтобы сделать его копией, просто измените obj2, как показано ниже, и он будет отлично работать для вашего случая pop()
let obj2 = Object.assign({}, obj, { arr : [...obj.arr] })
Object.assign
выполняет только мелкую копию, вложенные объекты будут скопированы по ссылке.
Вы можете стягивать и затем анализировать объект, чтобы сделать глубокий клон, но будьте осторожны, потому что если ваш объект содержит функции или круговые ссылки, они будут потеряны во время сериализации.
let obj = {key : 'Add',arr : [0,2,3]}
let obj2 = Object.assign({},obj,JSON.parse(JSON.stringify({arr :obj.arr})))
obj2.arr.pop()
console.log(obj)
console.log(obj2)
pop
влияет на оба массива?