코어 자바스크립트, 정재남 저 @
기본형(Primitive)과 참조형(Reference)를 구분하는 기준은 다음과 같다.
기본형은 불변성(immutability)를 띈다. 1-6에서 이 내용에 대해 좀 더 깊게 알아본다.
자바스크립트는 Dynamic typing 언어(동적 언어는 개발 속도가 빠르지만, 다양한 오류를 일으킬 수 있다. 정적 언어인 Typescript로 보완 가능하다)이다. 따라서 직접 데이터의 종류를 define할 필요 없으며, 데이터 종류는 자동적으로 할당된다.
console.log("chicken".legnth);
// expected output: 7
console.log("chicken".indexOf("C");
// expected output: 0
string 역시 유사 배열로 취급되기 때문에, 상기 코드와 같은 메서드를 실행시킬 수 있다. 아래 래퍼 객체에 대한 설명을 읽으면 이해가 쉽다.
Number("123");
// expected output : 123
Number("abc");
// expected output : NaN
하지만, typeOf를 사용할 경우
typeof(Number("123"))
"number"
typeof(Number("abc"))
"number"
"123"과 "abc" 값 모두 Number로 취급된다. NaN 역시 숫자값이기 때문.
Data Type Diagram을 참고하면, JS에는 총 6개의 원시(Primitive) 데이터 타입이 있다.
Number, String, Boolean, null, undefined, symbol
이 원시 타입에 대응하기 위해, JS에는 래퍼 객체(wrapper object)라는 개념이 있다.
String(), Number(), Boolean(), Symbol()
래퍼 객체는 말 그대로, 원시 타입을 감싸는 형태의 객체이다.
원시형 데이터 타입은 본래 객체와 같이 메서드를 가질 수 없으나, JS는 일시적으로 'Number', 'String', 'Boolean', 'Symbol' 타입에 일시적으로 '객체'화가 되는 것을 허락하며, 따라서 메서드를 사용할 수 있게 된다. 즉 래퍼 객체는, 원시 타입 데이터를 객체화 시켜주는 개념이다.
// 초기값이 할당되지 않은 변수
let hi;
console.log(hi); // undefined
// 초기값이 할당되지 않은 매개변수
function bye (a, b) {
console.log(a); // 1
console.log(b); // undefined
}
bye(1);
// 객체에서 존재하지 않는 속성을 접근하는 경우
const person = {
age: '18'
};
console.log(person.height); // undefined
let greeting = [ "hi", "hello", ];
console.log(greeting);
// (2) ["hi", "hello"]
let greeting = null;
console.log(greeting);
// null