하다보니
if (1 < x < 3) { // *어떤* x 값이던 참입니다!} 인 이유 본문
TypeScript 공식 문서를 보던 중
if (1 < x < 3) { // *어떤* x 값이던 참입니다! }
라는 코드를 보게 되었다. 해당 예시는 JavaScript 의 동일 연산자는 (==) 인수를 강제로 변환하여(coerces), 예기치 않은 동작을 유발한다라는 설명의 예시였다.
나는 왜 1<x<3에 어떤 x가 들어가도 참인지 이해가 가지 않았고, 찾아본 결과를 기록해두려 한다.
자바스크립트에서 비교 연산자 <, <=, >, >=, ==, != 는 피연산자의 타입이 다르다면 인수를 강제로 변환한다. 그래서 boolean과 number를 비교하게 되면 boolean을 숫자로 변환해서 연산하게 된다. false는 0으로 true는 1로. 이것이 ==대신 ===를 써야하는 이유이기도 하다.
실제로 1<x<3 의 동작은 아래와 같이 실행된다.
(1<x)<3
여기서 (1<x)의 값이 true거나 false여도 각각 1과 0으로 변환되어 최종적으로 비교하게 되는 3보다는 작은 수가 되는 것이다. 따라서 1<x<3는 x의 값에 상관없이 true가 되게 된다.

'프로그래밍 언어 > JavaScript' 카테고리의 다른 글
[JavaScript]실행 컨텍스트 (0) | 2022.05.30 |
---|---|
[JavaScript] 스프레드 연산자 (0) | 2022.03.26 |
[JavaScript] sort 함수 (0) | 2022.03.24 |
비동기의 꽃 JavaScript async와 await, 그리고 유용한 promise APIs (0) | 2022.01.24 |
프로미스 개념부터 활용까지 (0) | 2022.01.22 |