코어 자바스크립트: 핵심 개념과 동작 원리로 이해하는 자바스크립트 프로그래밍
기본형
: 값이 담긴 주솟값을 바로 복제- 숫자 (number)
- 문자열 (string)
- 불리언 (boolean)
- null
- undefined
- 심볼 (Symbol) - ES6에서 추가
참조형
: 값이 담긴 주솟값 묶음을 가리키는 주솟값을 복제- 객체 (object)
- 배열 (Array)
- 함수 (Function)
- 날짜 (Date)
- 정규표현식 (RegExp)
- Map, WeakMap - ES6에서 추가
- Set, WeakSet - ES6에서 추가
- 1byte = 8bit: 비트를 묶어주므로 검색 시간을 줄인다.
- 메모리 주솟값: 바이트 단위의 식별자 (위치 파악 가능)
- 변수: 변경 가능한 데이터가 담길 수 있는 공간
- 식별자: 데이터를 식별하는 데 사용하는 이름 (변수명)
- 메모리에서 비어있는 공간을 확보한 후, 공간을 식별자로 지정
- 변수 영역에 데이터 영역의 주솟값을 지정
- 확보된 공간을 변환된 데이터 크기에 맞게 늘리기 어렵기 때문에, 새로운 값 할당 시에는 새로운 데이터 공간의 주소를 연결
- 변경 가능성의 대상: 변수 영역 메모리
- 불변성 여부의 구분 대상: 데이터 영역 메모리
- 가변 (불변하지 않다)
- 객체의 변수 영역이 별도로 존재
- '새로운 객체'가 만들어지지 않고, 기존 객체 내부의 값만 변경
- 참조 카운트가 0이 되면 가비지 컬렉터의 수거 대상이 된다.
복사 후, 객체 프로퍼티 변경
- 기본형: 참조하는 값이 달라짐
- 참조형: 참조하는 값이 달라지지 않음
얕은 복사만을 수행
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[prop] = copyObjectDeep(target[prop]);
}
} else {
result = target;
}
return result;
};
- undefined를 반환하는 경우
- 값을 대입하지 않은 변수. 즉 데이터 영역의 메모리 주소를 지정하지 않은 식별자에 접근할 때
- 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
- return 문이 없거나 호출되지 않는 함수의 실행 결과
- null
- 비어있는 값을 명시적으로 나타내고 싶을 때 사용
- typeof null이 object 임을 주의