LHJ

I'm a FE developer.

3.20 요약

19 Apr 2020 » js_lj

프로그래밍 언어에서 데이터 타입은 말로 설명할 수 있는 것들을 프로그램에 구현하는 기본 요소입니다.
이 장에서 배운 것들 중 매일 사용하게 될 핵심은 다음과 같습니다.

  • 자바스크립트에는 문자열, 숫자, 불리언, 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}