이번에 소개드릴 내용은 이상한 자바스크립트이다.
1. 배열은 배열이 아닌것과 같다.
이게 무슨 소리일까?
console.log([] == ![])
console.log(+[] == +![])
위의 항등 연산자는 결과가 어떻게 될까?
특이하게도 위의 결과 둘다 true가 찍힌다.
항등연산자에서 빈 배열은 0으로 값이 있는 배열은 1로 형변환이 가능해진다.
[] == ![]
위의 []는 0으로 형변환이 되었고, ![]는 배열을 부정을 하여 false가 되었을 거다.
진위값 또한 false는 0으로 true는 1로 형변환이 가능해진다.
그렇기에 위처럼 둘다 true가 나오는 참사(?)가 발생했다.
2. 배열도 배열이 아닌것도 진실이 아니다.
console.log(true == [])
console.log(true == ![])
이번 문제는 1번의 해석을 잘 풀어보면 풀수 있을 것이다.
맞다. 위의 결과는 둘다 false가 나온다. 분명 둘중 하나의 경우에는 true를 뜻하고 있어야 함에도 불구하고, 서로 다른이유로 [], ![]을 항등 연상자에서 거짓으로 판별 당했다.
3. 0보다 작거나 같지않지만, 0이하인것
console.log(null == 0 || null < 0)
console.log(null <= 0)
대부분의 분들이 위의 결과를 둘다 false라고 알고 있을 것이다.
여태 배워온 몇몇 언어들이 null, N/A에 대해서 비교를 제한하고 있는 경우가 많다. 비교를 하면 무조건 거짓이 나온다는 등 말이다.
아래 링크를 보면 자세하게 알 수 있겠지만, 관계연산자 인 경우 숫자형으로 변환시키는 것이 더욱 강제적으로 수행된다고 보면 된다.
https://262.ecma-international.org/5.1/#sec-11.9.3
https://262.ecma-international.org/5.1/#sec-11.8.5
즉 아래의 주석과 같이 해석 되었다고 보면 된다.
console.log(null == 0 || null < 0) // null == 0 || null < 0
console.log(null <= 0) // +null <= 0
댓글
댓글 쓰기