HYEWON JUNG의 개발일지
데이터 타입 > 얕은 복사 , 깊은 복사 본문
<데이터 타입의 분리>
데이터 타입 | 기본형 | Number |
String | ||
Boolean | ||
Null | ||
undefined | ||
symbol | ||
참조형 > Object | Array | |
Function | ||
Date | ||
RegExp | ||
Map/WeakMap | ||
set / WeakSet |
<메모리의 기준>
변수 vs 상수
변수 = 변수영역에서 메모리 변경 가능
상수 = 변수영역에서 메모리 변경 불가능
가변하다 vs 부변하다
가변하다 = 데이터 영역에서 메모리 변경 가능
불변하다 = 데이터 영역에서 메모리 변경 불가능
<가변 불변 /복제방식>
기본형
변수 영역 | 1002 | 1003 | 1004 | 1005 | 1006 |
빈칸을 | 찾아가기 | origin / |
print/ |
||
데이터 영역 | 4001 | 4002 | 4003 | 4004 | 4005 |
test | real | second |
불변 Ex)
let origin = test ;
origin = real;
↑↑ 기본형의 불변성을 볼 수 있다.
=> origin에 새로운 값을 주었지만 데이터 영역의 test가 변하지 않고 real이 추가되었다.
=> 데이터 영역이 변하지 않았으므로 불변성.
복제 Ex)
let print = origin ;
print = second
기본형 복제
=> 값이 담김 주소값을 바로 복제
=> 나중에 print 값에 다른 것을 할당해줘도 문제 없다.
변수 영역 | 1002 | 1003 | 1004 | 1005 |
obj/7014~ | print/7014~ | |||
데이터영역 | 4103 | 4104 | 4105 | 4106 |
15 | 20 | 25 | 30 | |
데이터영역(obj) | 7014 | 7015 | 7016 | 7017 |
a/ |
b/ |
데이터 영역(a) | 8104 | 8105 | 8106 | 8107 |
c /4103 | d /4105 |
참조형
가변 Ex)
let obj = {a : 15, b : 20}
obj.a = {c : 15, d : 25} ;
↑↑ 참조형의 가변성을 볼 수 있다.
=> 데이터영역 obj가 변경되었다. 가변성
=> 중첨된 객체가 배열일 경우 데이터 영역에 인덱스로 표기
복제 Ex)
let print = obj ;
print.b = 30;
참조형 복사
=> 복사된 print의 b값으로 변경하면 원래의 obj의 b값도 변경된다.
=> 하지만 print의 prop를 참조형으로 바꾼다면 괜찮지만 중첩된 객체를 변경하게 되면 동일하게 변경된다.
참조형 복사 방법 1. ↑ 위 방법
let user = {name : "hyewon", age : 24};
let nameChange = function(user, newName){ // (user, newName) = input
return{name : newName, age : user.age} //output
};
let user2 = changeName(user, "hyeTwo")
if(user.name !== user2.name){console.log("change")} // change
=> 이름을 변경하는 함수 정의 / 아예 새로운 객체를 반환
input = 변경대상의 객체, 변경하고자 하는 것
output = 새로운 객체를 형성할 것
=> 객체가 중첩되어 있을 경우 복사본과 같아짐
=> 그리고 객체의 prop가 많을 경우 다 작성해야한다는 단점
참조형 복사방법 2. 반복문 만들기// 얕은 복사
let copyObject = function(target){
let result ={};
for(let prop in target){
result[prop] = target[prop]
}
return result;
}
사용해보기
let user ={name : "hyewon", age : 24};
let user2= copyObject(user);
user2.name="hyeTwo";
//user.name !== user2.name //true
=> 하지만 1번 방법에서 객체가 많아졌을 때 다 작성해야하는 단점만 해결
=> for in문을 이용해 객체의 모든 prop에 접근가능.
참조형 복사방법 3. 깊은 복사
let copyObjectDeep = function(target){
let result = {};
if(typeOf target ==='object' && target !== null){
for(let prop in taget){
result[prop] = copyObjectDeep(target[prop])
}
}else{
return target;
}
return result;
}
재귀적으로 수행
=> 객체의 속성의 속성으로 계속 수행한다.
'JavaScript' 카테고리의 다른 글
콜백함수 (제어권, this binding) (0) | 2023.10.30 |
---|---|
실행컨텍스트(VE, LE, record, hoisting 등) (0) | 2023.10.30 |
Map(); (1) | 2023.10.26 |
일급 객체로서의 함수 (0) | 2023.10.26 |
구조 분해 할당, 단축 속성명, 나머지 매개변수 (1) | 2023.10.18 |