JavaScript에서는 3가지 비교 연산이 존재한다.
===
엄격한 같음 (삼중 등호, 항등)==
느슨한 같음 (이중 등호)Object.is
(ECMAScript 2015에서 새로 생김)어떤 연산을 사용할지는 다음의 기준에 달려있다.
==
)는 두 가지를 비교할 때 유형 변환을 수행하고 IEEE 754를 준수하기 위해 NaN
, -0
및 +0
을 특별하게 처리한다. (NaN != NaN, -0 == +0 이다.)===
)는 이중 등호와 똑같지만 유형 변환을 수행하지 않는다. 그래서 형식이 다른 경우 false
가 반환된다.Object.is
는 형식 변환을 하지 않으며 NaN
, -0
및 +0
에 대한 특수 처리를 수행하지 않는다. (특수 숫자 값을 제외하고는 ===
와 동일한 동작을 제공한다.)NaN
과 -0
그리고 +0
처리 예시
NaN === NaN // false
-0 === +0 // true
Object.is(NaN, NaN) // true
Object.is(-0, +0) // flase
이제 Object.is
와 삼중 등호(===
)의 차이점은 충분히 이해했으니 이중 등호(==
)와 삼중 등호(===
)의 차이를 깊게 알아보자.
위에서 언급 했던 것처럼 이중 등호와 삼중 등호의 가장 큰 차이점은, 형식 변환의 유무이다.
A == B
와 B == A
의 결과가 항상 같다는 것을 의미한다.x | y | == | === |
---|---|---|---|
0 | false | true | false |
"" | false | true | false |
"" | 0 | true | false |
'0' | 0 | true | false |
'17' | 17 | true | false |
[1, 2] | '1,2' | true | false |
new String('foo') | 'foo' | true | false |
[1, 2] == '1,2'
가 true
로 나오는 것을 처음 알았다.==
가 하는 형식 변환을 모두 신경쓰기도 힘들고 이 모든 것을 신경써서 프로그래밍 한 일은 없을 것이다.==
를 사용해서 비교를 하면 예상이 힘들어 진다.==
을 멀리하고 ===
을 가까이 하는 것이 이롭다.