Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
Tags
- VITE
- 싸피
- 싸피셜
- db
- TypeScript
- unionfind
- 리액트
- PWA
- vitepwa
- react
- queryset
- 셀프넘버
- pwa적용하기
- QuerySetAPI
- 플로이드워셜
- 백준
- git
- sqld
- SSAFYcial
- Javascript
- Django
- 데코레이터
- SQL
- 머신러닝종류
- SSAFY
- js
- 알고리즘
- Python
- 14658
- 싸피10기
Archives
- Today
- Total
Meme's IT
[JS] 얕은 복사와 깊은 복사 본문
JS는 우선 원시 타입빼고는 다 얕은 복사
# 얕은 복사
1. 함수로 사용할 때
function fun(arr) {
arr[5] = 10
arr[0] = 0
}
let arr = [1, 2, 3]
fun(arr)
console.log(arr) // [0, 2, 3, 비어 있음 × 2, 10]
2. 그냥 복사하기
let numbers = [1, 2, 3]
let newNumbers = numbers // 얕은 복사
newNumbers[0] = 10
console.log(numbers) // [10, 2, 3]
console.log(newNumbers) // [10, 2, 3]
주소를 참고해 오기 때문에 다 얕은 복사가 된다
그렇다면.. 깊은 복사는 어떻게 하지?
# 깊은 복사
1. 배열
스프레드 연산자를 사용해준다
→ 객체를 전개해서 각 요소를 개별적인 값으로 분리해서 넣어 줌
let numbers = [1, 2, 3]
// 스프레드 연산자 사용
let newNumbers = [...numbers]
newNumbers[0] = 10
console.log(numbers) // [1, 2, 3]
console.log(newNumbers) // [10, 2, 3]
2. 객체
const obj = {
0: 1,
1: 2,
2: 3,
length: 3,
}
let newObj = obj
newObj[0] = 10
console.log(obj) // {0: 10, 1: 2, 2: 3, length: 3}
console.log(newObj) // {0: 10, 1: 2, 2: 3, length: 3}
우선, 그냥하면 깊은 복사가 안되는걸 알 수 있다...
그럼 어떻게 할까? 객체는 스프레드 연산자도 못 쓰는데
가장 간단한 방법으로는 JSON을 이용하면된다.
let newObj = JSON.parse(JSON.stringify(obj))
newObj[0] = 10
console.log(obj) // {0: 1, 1: 2, 2: 3, length: 3}
console.log(newObj) // {0: 10, 1: 2, 2: 3, length: 3}
하지만 JSON을 이용한 방법은 느리다.. 코테에서 사용하기엔 한계가 있음
재귀호출을 통해 해결할 수는 있지만 권장되지 않음 (그렇게 할 바엔 로직을 다시 짜는 게,,)
3. 2차원 이상일 때 배열의 깊은 복사는?
(찾아보기)
'FrontEnd > JavaScript' 카테고리의 다른 글
[JS] 동기와 비동기 (0) | 2023.10.30 |
---|---|
[JS] 이벤트 (0) | 2023.10.30 |
[JS] 'this' keyword (0) | 2023.10.25 |
[JS] 스코프 (1) | 2023.10.25 |
[JS] 배열(Array) (0) | 2023.10.25 |