암묵적 타입변환(= 타입 강제 변환)

개발자의 의도와는 상관없이 자바스크립트 엔진에 의해 암묵적으로 타입이 자동변환되는 현상

// ==== 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 ( 연산 불가능 )

동등비교 vs 일치비교

동등비교(loose equailty)일치비교(strict equality) 연산자는 엄현히 다르다 !

// EX) 동등비교
5 == 5;  // true

// 타입은 number 와 string 으로 다르지만, "암묵적 타입 변환"을 통해 먼저 타입이 일치시키고 비교
5 == '5';  // true
// EX) 일치비교
5 === 5;  // true

// 값 & 타입을 비교하기 때문에, 암묵적 타입을 하지 않은 두 값은 같지 않다.
5 === '5';  // false

<aside> 💡 이처럼, 동등비교(==) 연산자는 예측하기 어려운 결과 를 만들어낸다. 따라서 동등비교 연산자는 사용하지 않는 편이 좋다. 대신 일치비교(===) 연산자를 사용해라.

</aside>

NaN, +0 & -0, Object.is( ) 함수

<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