프로그래밍 언어에서 데이터 타입은 말로 설명할 수 있는 것들을 프로그램에 구현하는 기본 요소입니다.
이 장에서 배운 것들 중 매일 사용하게 될 핵심은 다음과 같습니다.
- 자바스크립트에는 문자열, 숫자, 불리언, null, undefined, 심볼의 여섯가지 원시 타입과 객체 타입이 있습니다.
- 자바스크립트의 모든 숫자는 배정도 부동소수점 숫자(더블)입니다.
(..번역본이라 오타가 들어간건가.. 배정도..? 무슨말이지..) - 배열은 특수한 객체이며, 객체와 마찬가지로 매우 강력하고 유연한 데이터 타입입니다.
- 날짜, 맵, 셋, 정규표현식 등 자주 사용할 다른 데이터 타입들은 특수한 객체 타입입니다.
프로그래밍을 하다 보면 문자열을 정말 많이 사용하게 될 겁니다.
다음 장으로 넘어가기 전에 문자열의 이스케이프 규칙과 문자열 템플릿이 어떻게 동작하는지 정확하게 이해하길 강력히 권합니다.
참조형과 원시형
원시 값은 불변이고, 원시 값을 복사/전달할 때는 값 자체를 복사/ 전달합니다.
따라서 ‘원본’의 값이 바뀌더라도 ‘사본’의 값이 따라서 바뀌지는 않습니다.
let a = 1; // 원본
let b = a; // 사본. b는 1입니다. a가 아닙니다.
a = 2; // 원본 값 바꿈
console.log(b); // 1. 사본의 값은 바뀌지 않음
또한, 값 자체를 복사했으므로 변수와 값은 일치합니다.
a === 2 // true
값 자체를 전달하므로 함수 안에서 변수의 값이 바뀌어도 함수 외부에서는 바뀌지 않은 상태로 남습니다.
function change (a) {
a = 5;
}
a = 3;
change(a);
console.log(a); // 3
객체는 가변이고, 객체를 복사/전달할 때는 객체가 아니라 그 객체를 가리키고 있다는 사실(참조)을 복사/전달합니다.
따라서 원본이 바뀌면 사본도 따라서 바뀝니다.
이런 특징을 강조하고 싶을 때 객체를 참조 타입이라고 부르기도 합니다.
let o = {a: 1};
let p = o; // 이제 p는 o가 '가리키고 있는 것'을 가리킵니다.
o.a = 2;
console.log(p); // {a: 2}
주의할 점이 하나 있습니다.
다음 코드는 앞의 예제와 비슷해 보이지만 결과는 전혀 다릅니다.
let o = {a: 1};
let p = o; // 이제 p는 o가 '가리키고 있는 것'을 가리킵니다.
p === o; // true
o = {a: 2}; // 이제 o는 다른 것을 가리킵니다. {a: 1}을 수정한 것이 아닙니다.
p === o; // false
console.log(p); // {a: 1}
객체를 가리키는 변수는 그 객체를 가리키고 있을 뿐, 객체 자체는 아닙니다.
따라서 변수와 객체는 결코 일치하지 않습니다.
let q = {a: 1};
q === {a: 1} // false
참조를 전달하므로 함수 안에서 객체를 변경하면 함수 외부에서도 바뀝니다.
function change_o (o) {
o.a = 999;
}
let o = {a: 1};
change_o(o);
console.log(o) // {a: 999}