동등연산자(==
과 !=
)는 두 피연산자를 비교하기 위해, Abstract Equality Comparison Algorithm
이라는 것을 사용한다고 한다.(이름부터 Abstract) 다행히 MDN에서는 간략하게 그 내용을 요약해 놓았는데 보자면
- 두 피연산자가 모두 객체일때, 동일한 객체를 참조할 경우 true 반환
- 하나가 null 이고 다른 하나가 undefined일 때 true 반환
- 하나의 피연산자가
Boolean
일 경우, true면 1로 변환 false일 경우 +0으로 변환- 하나는 객체고 다른 하나가 숫자나 문자열이면, 객체를 기본 데이터타입으로 변환하여 비교
밑에서 말할 일치 연산자(===)와의 가장 큰 차이점은 동등 연산자는 타입변환을 시도한다는 점이다.
다르게 말하면...
일치 연산자는 타입변환을 시도하지 않는다.
-> 다른 타입은 다르다고 판단한다.
묘한(!) 타입 변환의 예시
"1" == 1; // true
1 == "1"; // true
0 == false; // true
0 == null; // false
0 == undefined; // false
0 == !!null; // true
0 == !!undefined; // true
null == undefined; // true
const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3; // true, 동일 객체 참조
number1 == number2; // false, 다른 객체 참조
일치 연산자(==
과 !==
)는 Strict Equality Comparison Algorithm
이라는 친구(이름부터 !엄격!)를 사용하여 비교한다.
- 피연산자가 다른 타입이면 false
- 하나가 null이고 하나가 undefined면 false
boolean
은boolean
,string
은string
끼리... -> 같은 타입끼리만 비교
==
는 암묵적으로 타입 변환을 해서 비교하기 때문에 위 밈처럼 혼란스러운 상황이 생길 수 있으므로,
비교를 할 때는 항상===
을 쓰도록 하자!