본문 바로가기

JavaScript

[You Don`t Know JS] Chapter 1. 타입, Chapter 2. 값 정리

Chapter 1. 타입

 

'타입' 이란 자바스크립트 엔진, 개발자 모두에게 어떤 값을 다른 값과 분별할 수 있는, 고유한 내부 특성의 집합이다.

 

거의 모든 자바스크립트 프로그램에서 강제변환이 일어나므로 타입을 확실하게 인지하고 사용하는 것이 중요하다.

 

값 타입은 typeof 연산자로 알 수 있지만, null은 좀 특별하다. null에 typeof 연산자를 사용할 경우 'object' 라고 나온다.

 

-null이 object인 이유 (링크)

 

추가로 함수인 경우, typeof 연산자의 결과는 'object'가 아니라 'function' 으로 나온다. 실제로 function은 최상위 타입이 아니라 object의 하위 타입이다.

 

하지만 배열은 'object'라고 나온다. ('array'라고 나오지 않음)

 

1.3 값은 타입을 가진다.

값에는 타입이 있지만, 변수에는 따로 타입이 없다. (타입스크립트는 다름)

 

-타입스크립트에서 typeof 연산자는 어떤 결과를 가져올까? (자바스크립트와 똑같이 동작함)

 

typeof 연산자의 반환 값은 언제나 문자열이다.

 

1.3.1 

 

값이 없는 변수의 값은 undefined이며, 선언되지 않은 변수의 typeof 연산자 값도 undefined이다. 

 

 

Chapter 2. 값

 

2.1 배열

자바스크립트 배열은 어떤 타입이라도 담을 수 있는 그릇이다.

 

배열에 문자열 타입의 키/프로퍼티는 절대 사용하지 말고 인덱스에는 숫자만 사용하자.

 

2.2 문자열

문자열은 유사 배열이다. 하지만 문자열은 불변값이지만 배열은 가변값이다. 문자열 메서드는 그 내용을 바로 변경하지 않고 항상 새로운 문자열을 생성한 후 반환한다. 반면 대부분의 배열 메서드는 그 자리에서 곧바로 원소를 수정한다.

 

2.3 숫자

자바스크립트의 숫자 타입은 number가 유일하다. IEEE 754 표준을 따르며, 그중에서도 'Double Precision 표준 포맷을 사용한다.

 

이진 부동 소수점으로 나타낸 0.1과 0.2는 원래의 숫자와 일치하지 않는다. 이 둘을 더한 결과는 0.3이 아니다. 

이 둘의 동등함을 비교하기 위해 Number.EPSILON 이라는 상수로 비교할 수 있다는 데 굳이 그렇게 하고싶지는 않다.

일반적으로 함수를 하나 만들어서 사용하는 듯 하다. 아니면 라이브러리를 쓰던가.

 

2.4 특수 값

Undefined 타입의 값은 undefined이고, null 타입의 값은 null뿐이다.

 

void 연산자는 뒤에 어떤 값이 들어가든 항상 결과값을 undefined로 만든다.

잘 쓰이지는 않는데 값이 존재하는 곳에서 그 값이 undefined가 되어야 좋을 경우에만 사용하는 게 좋다.

 

NaN은 특별한 경우에서 수학 연산의 값이 에러 상황이 났다는 것을 말한다.

원래 NaN을 비교하는 것이 좀 까다로왔는데 ES6 부터 Number.isNaN 함수를 사용해서 확인하면 편하다.

 

0은 -0과 +0이 있는데, 값의 크기로 어떤 정보와 그 값의 부호로 또 다른 정보를 동시에 나타내야 하는 애플리케이션이 있기 때문이다. (속도와 방향)

 

동등 비교에서 0과 -0을 비교하는 게 골치가 아팠는데, ES6부터 Object.is() 함수를 이용해서 특이한 친구들의 동등 비교를 쉽게 할 수 있다.

하지만 모든 비교를 위 함수를 이용해서 하는 것은 곤란하다.

 

2.5 값 vs 레퍼런스

자바스크립트에서는 어떤 변수가 다른 변수를 참조할 수 없다. 그냥 안된다.

값의 타입으로 값-복사인지 레퍼런스 복사인지가 결정된다.

 

null, undefined, string, number, boolean, symbol은 값-복사 방식으로 할당/전달 된다.

객체나 함수 등 합성 값은 반드시 레퍼런스 사본을 생성한다.

 

합성 값을 값-복사에 의해 효과적으로 전달하려면 손수 값의 사본을 만들어 전달한다.

 

값-복사냐 레퍼런스-복사냐를 결정하는 유일한 단서는 값의 타입뿐이므로 사용할 값 타입을 잘 정해서 간접적으로 할당/전달 로직에 반영해야 한다.

 

 

 

 

'JavaScript' 카테고리의 다른 글

[React] React의 LifeCycle 정리  (0) 2020.02.22
함수와 프로토타입 체이닝 (2)  (0) 2020.02.21
함수와 프로토타입 체이닝 (1)  (0) 2020.02.19
JS 면접 문제 질문과 답변  (2) 2018.08.27
http 두꺼운 책 읽는법  (0) 2018.06.10