기본형(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 두 가지.