개발자의 의도와는 상관없이
자바스크립트 엔진에 의해 암묵적으로 타입이 자동변환되는 현상
// ==== EX ====
// number + string 연산 경우
'1' + 2; // '12'
1 + '2'; // '12'
// boolean + number 연산 경우
1 + true; // 2
1 + false; // 1
// number + null 연산 경우
1 + null; // 1
// number + undefined 연산 경우
1 + undefined; // NaN ( 연산 불가능 )
암묵적 타입변환
케이스가 많다.
동등비교(loose equailty)
와일치비교(strict equality)
연산자는 엄현히 다르다 !
동등비교(loose equailty)
==
느슨한 비교
: 좌항과 우항의 피연산자를 비교할 때, 먼저 암묵적 타입 변환을 통해 타입을 일치시킨 후
, 값이 같은지 비교
// EX) 동등비교
5 == 5; // true
// 타입은 number 와 string 으로 다르지만, "암묵적 타입 변환"을 통해 먼저 타입이 일치시키고 비교
5 == '5'; // true
일치비교(strict equality)
===
엄격한 비교
: 좌항과 우항의 피연산자가 타입도 같고, 값도 같은지 비교
, 즉, 암묵적 타입 변환을 하지 않고 값을 비교
// EX) 일치비교
5 === 5; // true
// 값 & 타입을 비교하기 때문에, 암묵적 타입을 하지 않은 두 값은 같지 않다.
5 === '5'; // false
<aside>
💡 이처럼, 동등비교(==) 연산자는 예측하기 어려운 결과
를 만들어낸다. 따라서 동등비교 연산자는 사용하지 않는 편이 좋다. 대신 일치비교(===) 연산자를 사용해라.
</aside>
<aside>
💡 일치 연산자(===)라 해도 NaN
에 대해서는 주의할 것
</aside>
// NaN은 자신과 일치하지 않는 유일한 값이다.
NaN === NaNl // false
// NaN 인지 조사가 필요시 -> 빌트인 함수 "isNaN(value)"을 사용
isNaN(NaN); // true
isNaN(10); // false
isNaN(1 + undefined); // true (1 + undefined 결과는 NaN 이기 때문)
<aside>
💡 +0
과 -0
이 존재한다. 다만 이 둘을 비교하면 true 를 반환
한다.
</aside>
// 양의 0과 음의 0의 비교, 일치비교/동등비교 모두 결과는 true
0 === -0; // true
0 == -0; // true
/*
[ 💡 Object.is 메서드 ]
ES6에서 도입된 Object.is 메서드는 "예측 가능한 정확한 비교 결과를 반환한다."
그 외에는 일치 비교 연산자(===)와 동일하게 동작한다.
*/
+0 === -0; // true
Object.is(-0, +0); // false
NaN === NaN; // false
Object.is(NaN, NaN); // true