+) iterable 배열 또는 요소가 키-값 쌍으로 구성된 객체
var a;
// 변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다. (선언)
a= 'abc';
// a라는 식별자를 검색하여 데이터 영역에 저장한 문자열 'abc'를 대입한다.(할당)
상수 vs 불변값
- 상수: 변수 영역의 메모리에 데이터를 재할당할 수 없다.
- 불변값: 데이터 영역의 메모리에 데이터를 재할당할 수 없다.
var obj1 = {
a: 1,
b: 'bbb'
};
// 변수 영역에 식별자가 obj1인 데이터를 만든다.
// 데이터 영역에 여러개의 프로퍼티로 이루어진 주소를 저장한다. (-> 기본형 데이터와 차이)
obj1.a = 2
// 새로운 객체가 만들어진 것이 아니라 기존의 객체 내부의 값만 바뀐다.
객체의 변수(프로퍼티) 영역이 별도로 존재한다. 데이터 영역에 저장된 값은 불변값이지만 변수(프로퍼티)에는 다른 값을 얼마든지 대입할 수 있다.
값으로 전달받은 객체에 변경을 가하더라도 원본 객체는 변하지 않아야 하는 경우 필요하다.
얕은복사: 바로 아래 단계의 값만 복사하는 방법. 중첩된 객체에서 참조형 데이터가 저장된 프로퍼티를 복사할 때 그 주솟값만 복사한다.
사본을 바꾸면 원본도 바뀌고, 원본을 바꾸면 사본도 바뀐다.
깊은복사: 내부의 모든 값들을 하나하나 찾아서 전부 복사하는 방법. 참조형 데이터는 내부의 프로퍼티들을 복사해야 한다.
참조형 데이터를 불변값으로 사용하는 방법
어떤 변수에 값이 존재하지 않을 경우.
let arr1 = [undefined, 1];
let arr2 = [];
let arr3 = [];
arr2[1] = 1
arr3.length = 3
console.log(arr2) // [ <1 empty item>, 1 ]
console.log(arr3) // [ <3 empty items> ] undefined조차 할당되어 있지 않음.
console.log(arr1[0]) // undefined: 할당된 값이 undefined인 경우
console.log(arr2[0]) // undefined: 객체 내부의 존재하지 않는 프로퍼티에 접근하는 경우
console.log(arr4) //arr4 is not definded
let arr5 = [,,] // [ <1 empty item> ] 뒤의 콤마는 의미가 없다아. 배열도 객체!
// length 프로퍼티의 개수만큼 빈 공간을 확보하고 지정하는 것이 아니다.
// 값이 지정되지 않은 인덱스는 '아직은 존재하지 않는 프로퍼티'
비어있는 요소에 접근하려 할 때 반환되는 undefined
-> 순회의 대상이 되지 않고, 배열의 키값(인덱스), 프로퍼티 자체가 존재하지 않는다.
- 값을 대입하지 않은 변수, 메모리 주소를 지정하지 않은 식별자에 접근할 때
- 객체 내부의 존재하지 않는 프로퍼티에 접근하려고 할 때
- return문이 없거나 호출되지 않는 함수를 실행한 결과
typeof null = object
코어 자바스크립트 / 정재남