const original = { a: 1, b: 2 }
const copied = original
original.a = 1000
console.log(copied.a) //1000
const obj = { a: 1, b: 2 }
const target = { c: 3 }
const copiedObj = Object.assign(target, obj)
console.log(copiedObj) //{c: 3, a: 1, b: 2}
const person = {
age: 100,
name: {
first: "junwoo",
last: "park",
},
}
const copied = Object.assign({}, person)
person.age = 1000
person.name.first = "paul"
console.log(copied.age) // 100
console.log(copied.name.first) // 'paul'
const original = {
a: 1,
b: 2,
c: {
d: 3,
},
}
const copied = { ...original }
original.a = 1000
original.c.d = 3000
console.log(copied.a) // 1
console.log(copied.c.d) // 3000
const cloneObj = obj => JSON.parse(JSON.stringify(obj))
const original = {
a: 1,
b: {
c: 2,
cc: 3
},
d: () => {
console.log("hi")
},
}
const copied = cloneObj(original)
console.log(copied.b) // { c:2, cc:3 }
console.log(copied.d) // undefined
JSON의 stringify메소드는 JS 객체를 JSON 문자열로 변환시킨 이후 JSON의 parse 메서드를 통해 다시 JS 객체로 변환하는 방법이다.
하지만 JSON 방법은 성능적으로 느리다는 단점과 위의 예시에서 copied.d 처럼 JSON.stringify 메서드가 function을 undefined로 처리한다는 단점을 가지고 있다.
const clonedeep = require("lodash.clonedeep")
const original = {
a: 1,
b: {
c: 2,
},
d: () => {
console.log("hi")
},
}
const deepCopied = clonedeep(original)
original.a = 1000
original.b.c = 2000
console.log(deepCopied.a) // 1
console.log(deepCopied.b.c) // 2
console.log(deepCopied.d()) // 'hi'