이 글은 코어 자바스크립트를 읽고 학습용으로 요약 및 정리한 글입니다.
기본형은 불변성? 그치만 변경할 수 있는데? => 메모리 영역에서 자바스크립트 데이터 처리 과정을 이해해 보자!
자바스크립트는 왜 형변환이 자유로울까
- 정적 타입 언어(C, C++, JAVA): 메모리 낭비 최소화를 위해 데이터 타입별로 할당 메모리 영역을 정해 놓음
- 자바스크립트는 메모리 용량이 과거보다 커진 상황에 등장 => 메모리 공간을 조금 더 넉넉히 할당 => 형변환 걱정이 덜 발생
var a; // 변수 a 선언
a = 'abc'; // 변수 a에 데이터 할당
var a = 'abc'; // 변수 선언과 할당
변수 영역
@1003: 이름 - a, 값 - @5004
데이터 영역
@5004: 'abc'
변수 영역에 값을 직접 대입하지 않고 데이터의 주소를 저장 -> 자유로운 데이터 변환 & 효율적인 메모리 관리 & 높은 중복 데이터 처리 효율
더 이상 기존 데이터가 사용되지 않는 경우에는 어떻게 할까?
- 참조 카운트: 어떤 데이터에 대해 자신의 주소를 참조하는 변수의 개수
- 참조 카운트가 0인 메모리 주소는 가비지 컬렉터(
GC
)의 수거 대상이 됨- 특정 시점이나 메모리 사용량에 따라 자동으로 수거 대상들을 수거
- 수거된 메모리는 다시 새로운 값을 할당할 수 있는 빈 공감이 됨
var obj1 = {
a: 1,
b: 'bbb'
};
변수 영역
@1002: 이름 - obj1, 값 - @5001
데이터 영역
@5001: @7013 ~ ?
@5003: 1
@5004: 'bbb'
객체 @5001의 변수 영역
@7103: 이름 - a, 값 - @5003
@7104: 이름 -b, 값 - @5004
그래서 객체 복사는 항상 주의해야 한다! 복사한 이후 객체를 변경했다가 기존 객체도 변경되면... 🥲
앞서 말한 것처럼 데이터 자체를 변경하기 (새로운 데이터 할당)
- 내부 프로퍼티를 변경할 필요가 있을 때마다 매번 새로운 객체를 만들어 재할당
- 자동으로 새로운 객체를 만드는 도구 활용
그렇다면 대상 객체의 프로퍼티 개수에 상관없이 모든 프로퍼티를 복사하는 함수를 만들어둘까?
var copyObject = function(target) {
var result= {};
for (var prop in target){
result[prop] = target[prop];
}
return result
}
이러한 문제를 해결하기 위해서 중첩된 객체의 내부 프로퍼티도 다시 복사해야 한다
var copyObjectDeep = function(target){
var result = {};
if (typeof target === 'object' && target !== null){
for (var prop in target){
result[props] = copyObjectDeep(target[prop]);
}
} else {
result = target;
}
return result;
}
자바스크립트 엔진은 사용자가 어떤 값을 지정할 것이라고 예상되는 상황임에도 실제로 그렇게 하지 않았을 때 undefined를 반환
var arr1 = [];
arr1.length = 3;
console.log(arr1); // [empty x 3]
var arr2 = [undefined, undefined, undefined];
console.log(arr2); // [undefined, undefined, undefined]
비어있는 요소와
undefined
를 할당한 요소는 다르다
비어있는 요소는 순회와 관련된 많은 배열 메서드들의 순회 대상에서 제외됨 => 배열도 객체다 (아직 존재하지 않는 프로퍼티!)
혼란을 피하기 위해 비어있음을 명시적으로 나타내고 싶을 때는 null을 사용하자