특수 값
다음은 특수한 값에 대해 알아보겠습니다. 타입에 따라 주의해서 사용해야 할 값들입니다.
우선 타입과 값이 같은 경우입니다. undefined와 null은 타입이자 값 그 자체입니다. 여기서 null은 식별자가 아닌 키워드이므로 어떤 의미로 정의하여 사용하는지는 개발자의 마음이지만, null 이외의 값을 할당할 수는 없습니다. 그러나 undefined는 식별자이므로 임의의 값을 할당할 수 있습니다.
undefined는 지역 변수의 이름으로도 사용할 수 있습니다. 그러나 가능하다고 해서 무조건 하는건 좋은 선택이 아닐 것 같습니다...
다음으로 살펴볼 것은 void입니다. 표현식 void는 모든 값을 undefined로 만들어버립니다. 기존 값에 영향을 미치지 않고 undefined를 출력시키고, 원본 값을 그대로 사용할 수 있다는 장점이 있지만 한번 undefined로 변경된 값은 다시 복구할 수는 없습니다.
특수 숫자
숫자 타입에서 나올 수 있는 값 중 몇 가지 특이한 케이스들을 살펴보겠습니다. 수학 연산시 두 피연산자가 숫자가 아닐 경우에 (유효하지 않을 경우) NaN (Not a Number)을 반환하게 됩니다.
직역하면 "숫자가 아니다" 지만 유효하지 않은 숫자 정도로 생각하시는게 좋습니다. 뜻은 숫자가 아니지만 타입 검사를 해보면 분명한 number 니까요.
NaN은 정말 특이합니다. 어떤 값과 비교해도, 심지어 자기 자신과 비교해도 true 값을 반환하지 않는 유일무이한 값입니다. 이러한 속성을 "반사성(reflexive)이 없다" 라고 말합니다.
따라서 NaN을 확인하는 방법은 내장 유틸리티인 isNaN() 을 사용해야하는데, 유틸리티의 로직 자체에 문제가 있으니 ES6부터 지원하는 Number.NaN()을 사용하면 됩니다. 혹시라도 지금까지 isNaN()을 사용해왔다면 이 기회에 수정해주도록 합시다.
무한대
자바스크립트에는 무한대의 개념이 이미 정의되어 있습니다. 양의 무한대는 Number.POSITIVE_INFINITY, 음의 무한대는 Number.NEGATIVE_INFINITY로 확인할 수 있습니다.
정의된 프로퍼티를 사용하지 않고 직접적인 계산을 통해서도 무한대에 도달할 수 있습니다. 수학적인 사고로는 불가능하지만, 자바스크립트는 유한 숫자 표현식을 사용하기 때문에 이런식으로 큰 수를 더하거나 곱해주면 무한대가 됩니다.
C에서는 무한대에 관련한 연산을 적용하려하면 오류가 났었는데, 위의 과정을 보면 유한에서 무한으로 가는 것은 가능한 것을 알 수 있습니다. 다만 무한에서 다시 유한으로 돌아가는 것은 불가능합니다.
0
0이 뭐 특별할게 있을까 싶지만 자바스크립트의 0은 부호를 가지고 있습니다. 보통 우리가 사용하는 0은 양의 0(+)이고, 음의 0이 존재합니다. 일반적인 덧셈과 뺄셈으로는 나오지 않고, 곱셈과 나눗셈으로만 확인할 수 있습니다.
0의 부호는 0에 도달하기까지의 진행 방향을 담고 있습니다. 양의 값에서 내려온 것인지, 음의 값에서 올라온 것인지에 대한 정보를 소실하지 않기 위해 부호를 보존한 것인데 0 근처에서 움직이는 값을 계산하는 경우 유용하게 사용할 수 있습니다.
다만 -0은 일부 브라우저에서는 표기되지 않을 수 있습니다. (IE는 모두 0으로 표기)
추가로 0의 부호를 포함한 NaN의 값을 비교하기 위해서는 ES6에 추가된 Object.is()를 사용하면 정확히 비교할 수 있습니다.
값, 레퍼런스
다른 언어에서도 정말 많이 등장했던 개념인 값과 레퍼런스입니다. 자바스크립트에선 포인터의 개념이 없기 때문에 다른 변수에 대한 참조가 없습니다. 서로에 대한 레퍼런스 같은 것은 없고, 공유된 단일의 값을 각각 참조합니다.
또한 값 복사를 할지, 레퍼런스 복사를 할지도 개발자가 결정할 수 없습니다. 대신 값의 타입에 의해서 자동으로 결정됩니다.
값 복사 방식으로 적용되는 타입은 다음과 같습니다.
- null
- undefined
- string
- number
- boolean
- symbol
레퍼런스 복사 방식으로 적용되는 타입은 다음과 같습니다.
- 객체
- 함수
b는 a의 값을 복사하였으므로 이후의 b++; 구문은 a의 값에 영향을 미치지 않습니다.
레퍼런스 복사의 경우 공유된 하나의 값에 영향을 미치기 때문에 c와 d의 값 모두 변하게 됩니다.
정리
- 배열은 모든 타입의 값을 숫자로 인덱싱한 집합입니다.
- 숫자는 정수와 소수를 구분하지 않습니다.
- 원시 타입 중 null과 undefined는 타입이 곧 값입니다.
- 숫자에는 NaN, +-Infinity, -0 의 특수값이 존재합니다.
- 단순 스칼라 값은 값 복사로, 합성 값은 레퍼런스 복사로 값이 전달됩니다.
'이론 > Frontend' 카테고리의 다른 글
JavaScript의 강제변환 - 1 (Coercive Type Conversion of JavaScript) (0) | 2021.03.02 |
---|---|
JavaScript의 네이티브 (Natives of JavaScript) (0) | 2021.02.21 |
JavaScript의 값 - 1 (Value of JavaScript) (0) | 2021.02.17 |
JavaScript의 타입 (Type of JavaScript) (0) | 2021.02.15 |
동기와 비동기 (Synchronous & Asynchronous) (0) | 2020.09.18 |
댓글