
기본형(Primitive Type)
: number, boolean, null, undefined, Symbol(ES6부터 추가) 등이 있음
참조형(Reference Type)
: object과 그 하위 분류로 array, function, date, regExp, Map(ES6~), WeakMap(ES6~), Set(ES6~), WeakSet(ES6~) 등이 있음
기본형은 값이 담긴 주솟값을 바로 복제 VS 참조형은 값이 담긴 주솟값들로 이루어진 묶음을 가리키는 주솟값을 복제함.: 변할 수 있는 수. ('수'로 표현하는 이유는 수학용어를 차용했기 때문. 반드시 숫자인 것은 아니고 데이터를 말함)
: 어떤 데이터를 식별하는 데 사용하는 이름. 즉 변수명
var a; // 변할 수 있는 데이터를 만든다. 이 데이터의 식별자는 a로 한다.
: 변수는 변경 가능한 데이터가 담길 수 있는 공간 또는 그릇이라고 생각할 수 있음.
👉 @1에 'abc'값을 직접 대입하지 않고 굳이 한 단계를 더 거치는 이유?
: 데이터 변환을 자유롭게 하고, 메모리를 효율적으로 관리하기 위함. Js에서 number 타입은 8바이트 공간을 할당하지만 문자열은 정해진 규격이 없으므로 글자수에 따라 가변적으로 메모리 가변적. 만약에 미리 확보된 공간 내에서만 데이터 변환할 수 있다면 데이터 재저장을 위해서 확보된 공간을 변환할 데이터의 크기에 맞게 늘리는 작업을 수행해야 함. 이것을 피하기 위해서 변수와 데이터를 별도의 공간에 나누어 저장하는 것이 최적!
변수 vs 상수를 구분하는 성질은 변경가능성불변값 vs 상수
: 불변성 여부 구분할 때 변경 가능성의 대상은 데이터 영역 메모리
기본형 데이터는 모두 불변값.
var a= 'abc';
a = a + 'def'; //새로운 문자열 'abcdef'를 만들어 그 주소를 변수 a에 저장.(abc / abcdef는 완전히 별개의 데이터)
var b = 5; // 데이터 영역에 5가 없으므로 새로 데이터 공간 만들어서 5 저장. 그 주소를 변수 b에 저장.
var c = 5; // 데이터 영역의 기저장된 5의 주소를 재활용해 c에 저장.
b = 7; // 데이터 영역에 7을 만들고 b에 다시 저장. → 5, 7 은 다른 값을 변경할 수 없고 변수에서 새로운 값이 필요하면 새로 만들어야 함.
참조형 데이터는 기본적인 성질은 가변값인 경우가 많지만, 설정에 따라 변경 불가능한 경우도 있고, 불변값으로 활용하는 방안도 있음.
var obj1 ={
a: 1,
b: 'bbb'
}
... 생략
var obj ={
x: 3,
arr: [3,4,5]
}
기본형은 주솟값을 복사하는 과정이 한번만 이뤄지고, 참조형은 한 단게를 더 거치게 된다는 차이가 존재함.var user = {
name : 'james',
gender : 'male'
}
var changeName = function (user, newname) {
return {
name : newName,
gender : user.gender
}
}
var copyObj = function (target) {
var result = {};
for (var prop in target) {
result[prop] = target[prop]
}
return result;
}
기본형 데이터일 경우 그대로 복사해도 되지만, 참조형 데이터는 다시 그 내부의 프로퍼티까지 재귀적으로 복사해야 기존 객체에 영향 X
: 사용자가 명시적으로 지정하거나, js 엔진이 부여하기도 함.
비어있는 요소는 순회와 관련된 많은 배열 메서드들의 순회 대상에서 제외됨(건너뜀).주의할 점 : typeof null 은 'object'인 js버그가 있음...
변수는 변경가능한 데이터가 담길 수 있는 공간.식별자는 그 변수의 이름없음을 나타내는 값은 null, undefined 두 가지.