Boolean Type (불 타입)
- 불 타입은 true, false 만 가질 수 있다.
- true, false 에 대해 typeof 연산자는 "boolean" 을 반환합니다.
관계 연산자 | |
=== | 같음 |
!== | 같지 않음 |
< | 보다 작음 |
<= | 보다 작거나 같음 |
> | 보다 큼 |
>= | 보다 크거나 같음 |
- 관계 연산자에서 몇가지 특이 케이스
- undefined < null // false
- undefined > null // false
- undefined === null // false
- NaN === NaN // false
- NaN !== NaN // true
- "11" < "2" // true
- "2" < 5 // true
- 5 < "11" // true
- 값이 NaN 인지를 확인하려면 반드시 Number.isNaN(x) 을 사용해야 한다.
- 반복문의 종료 조건으로 === 을 사용하려면, 종료 조건을 나타내는 변수 값이 안전한 정수 범위 안에 있을 때만 사용해야 합니다.
안전한 범위 안이라 해도, === 보다 >= 연산자가 더 안전합니다.
- 자바스크립트에서 == 와 != 는 절대 사용하지 않아야 합니다.
이 연산자들은 비교 연산을 하기 전에 강제로 형변환을 하기에, false positives 와 false negatives 가 발생할 수 있습니다.
꼭 === 와 !== 를 사용해야 합니다.
- 불이 제대로 쓰이는 위치
- if 문의 조건문 위치
- while 문의 조건문 위치
- for 문의 조건문 위치
- do 문의 조건문 위치
- ! 연산자의 피연산자 위치
- && 연산자의 양쪽 피연산자
- || 연산자의 양쪽 피연산자
- ? 와 : 로 구성된 삼항 연산자의 첫 번째 피연산자 위치
- Array 의 filter, find, findIndex, indexOf 메서드의 첫 번째 인자로 전달되는 함수의 반환 값
하지만 자바스크립트에선 위의 나열된 위치에 아무 값이나 들어갈 수 있습니다. 이러한 모든 값은 '불인 척하는' 자료형에 포함됩니다. 해당 자료형에 속한 값은 '참이라고 볼 수 있는 값(truthy)' 이거나 '거짓이라고 볼 수 있는 값(falsy)' 둘 중 하나입니다.
- 거짓이라고 볼 수 있는 값
- false
- null
- undefined
- "" (빈 문자열)
- 0
- NaN
위의 값 외 다른 모든 값은 '참이라고 볼 수 있는 값' 에 해당합니다. 여기에는 빈 객체, 빈 배열, "false", "0" 같은 문자열도 포함되며
흔히들 개발 작업 중에 if ({}) 와 같이 빈객체를 false 라고 판단해 비교하는 실수를 자주 합니다.
'붙인 척하기' 는 C 언어의 관용구를 자바스크립트에서도 사용할 수 있도록 하기 위해 일부러 만든 것이지만 C 에선 0, FALSE, NULL, 문자열의 끝 와 같은 것을 단 하나의 값으로 표현하기에 이 부분이 자바스크립트와 달라 JS 에선 실수처럼 느껴집니다.
- 조건문에는 꼭 불 값을 쓰도록 합니다.
- not 연산자를 두 번 쓰는 방식은 단순화하는 것이 좋습니다.
!!p === p 는 오직 p가 불 값일 경우에만 정확합니다. p가 불 타입이 아니라면 !!p는 Boolean(p) 와 같은 값이지, p와 같은지는 알 수 없습니다. 몇몇 비교 연산자 및 논리 표현식 또한 다음과 같은 단순화된 표현이 가능합니다.
- !(a === b) === (a !== b)
- !(a <= b) === (a > b)
- !(a > b) === (a <= b)
- !(a >= b) === (a < b)
- !(p && q) === !p || !q
- !(p || q) === !p && !q
- 실무에서 실제로 모든 경우에 이를 지키긴 어렵지만, 최대한 '불인 척하는 값' 은 피하고 진짜 불 값을 사용하는게 좋습니다.
출처 : 자바스크립트는 왜 그 모양일까?
'Backend > Javascript' 카테고리의 다른 글
[Javascript] - Object (0) | 2020.10.31 |
---|---|
[Javascript] - Array (0) | 2020.10.24 |
[Javascript] - Big Integer (0) | 2020.10.10 |
[Javascript] - Number (0) | 2020.10.03 |
[Javascript] - Name (0) | 2020.09.26 |