JavaScript에서 ==, ===의 차이점
==
==
는 느슨한 같음(loose equality)으로 두 값이 같은지 비교합니다. 이때, 두 값을 공통 형(type)으로 암묵적으로 변환합니다. 암묵적 변환은 서로 다른 타입이면 Number
타입으로 변환하고 최종 같음 비교는 ===
처럼 수행됩니다.
- 두 값의 타입이 같으면 그대로 비교합니다.
- 두 값의 타입이 다르면 다음과 같은 규칙으로 타입을 변환합니다.
- null과 undefined는 서로 같습니다.
- boolean 타입은 Number 타입으로 변환합니다. true는 1, false는 0으로 변환됩니다.
- string 타입은 Number 타입으로 변환합니다. 문자열이 숫자로 이루어져 있다면 해당 숫자로 변환됩니다. 그렇지 않으면 NaN으로 변환됩니다.
- object 타입과 symbol 타입은 Number 타입으로 변환합니다. valueOf() 메소드가 숫자를 반환하면 해당 숫자로 변환됩니다. valueOf() 메소드가 숫자가 아니라면 toString() 메소드의 반환값(문자열과 비교라면 그대로 비교를 시작)을 다시 Number 타입으로 변환합니다. 그렇지 않으면 NaN으로 변환됩니다.
- NaN == NaN은 false입니다.
===
===
는 엄격한 같음(strict equality)으로 두 값이 같은지 비교합니다. 이때, 형 변환은 일어나지 않고, 둘이 서로 다른 형이면, 둘은 같지 않다고 판단합니다.
관련 내용
==
는 암묵적 형변환이이 일어나는데, 암묵적 형변환이 일어날 것을 모두 기억하거나 예측하는 것이 어렵기 때문에, 의도하지 않은 결과를 얻게 될 가능성이 크고 이로 인해 오류 가능성이 커집니다. 따라서 동등함을 비교하기 위해서 ===
를 사용하는 것이 좋습니다.
- 비교 연산 중에 ES6(ECMAScript 2015)에 추가된
Object.is
도 있습니다. 0
, -0
, NaN
, 비교 이외에는 ===
연산과 동일한 결과를 줍니다.
- Object.is(NaN, NaN)은 false가 아닌 true를 반환합니다.
- Object.is(+0, -0)은 true가 아닌 false를 반환합니다.
- 객체간 비교할 경우 객체 안의 내용이 같더라도 참조형이기 때문에
==
, ===
, Object.is
로 비교하면 false
로 판단합니다. 따라서 JSON.stringify
로 객체 안의 내용을 문자열로 변환한 후 비교 하거나 순서가 보장되지 않는 값이라면, 정렬 후 비교 합니다.
참고