프로그래밍/JavaScript
[JavaScript] 얕은 복사, 깊은 복사
승민아
2022. 12. 27. 16:40
배열의 얕은 복사(참조 복사)
const 물건박스1 = ['우유', '식빵']
const 물건박스2 = 물건박스1
물건박스2.push('감자')
물건박스2.push('고구마')
console.log(물건박스1)
console.log(물건박스2)
배열을 다른 배열의 이름으로 할당해주면 같은 공간을 가리키는 이름만 다를 뿐 독립적이지 못하다.
배열의 깊은 복사
두 배열을 전개 연산자를 통해 완전히 독립적인 상태로 만들 수 있다.
전개 연산자 : [...배열]
const 물건박스1 = ['우유', '식빵']
const 물건박스2 = [...물건박스1]
물건박스2.push('감자')
물건박스2.push('고구마')
console.log(물건박스1)
console.log(물건박스2)
+ 배열 요소 추가
const 물건박스1 = ['우유', '식빵']
const 물건박스2 = ['감자' ,...물건박스1, '고구마']
console.log(물건박스1)
console.log(물건박스2)
두 개의 배열을 합치는 것 또한 가능하다.
const a = ['감자', '고구마']
const b = ['우유', '식빵']
console.log([...a, ...b])
객체의 얕은 복사
const 학생1 = {
name: '이승민',
age: 1
}
const 학생2 = 학생1
학생2.name = '하하호호'
학생2.age = 100
console.log(학생1)
console.log(학생2)
객체의 깊은 복사
마찬가지로 전개 연산자를 이용해 깊은 복사를 한다.
{...객체}
const 학생1 = {
name: '이승민',
age: 1
}
const 학생2 = {...학생1}
학생2.name = '하하호호'
학생2.age = 100
console.log(학생1)
console.log(학생2)
+ 객체 요소 추가 및 덮어쓰기
const 학생1 = {
name: '이승민',
age: 1
}
const 학생2 = {
...학생1,
취미: '밥먹기',
name: '하하호호',
age: 100
}
console.log(학생1)
console.log(학생2)
+ 전개 연산자의 순서에 따라 덮어 쓸지, 덮여 쓸지 결정할 수 있다.
위의 예제를 다르게 수정하여 학생2에 ...학생1를 뒤쪽에 넣는다면?
const 학생1 = {
name: '이승민',
age: 1
}
const 학생2 = {
취미: '밥먹기',
name: '하하호호',
age: 100,
...학생1
}
console.log(학생1)
console.log(학생2)
취미만 추가되고 name, age를 설정하여도 뒤에서 학생1의 정보로 덮여쓰이기 때문에
하하호호 100살은 수정된다.