간단히 말하면: == 먼저 유형을 변환한 다음 비교하고, === 먼저 유형을 결정합니다. 동일한 유형이 아닌 경우 직접 false가 됩니다.
===는 같음을 의미하며 비교의 양쪽이 완전히 동일해야 합니다
alert(0 == ""); // true alert(0 == false); // true alert("" == false); // true
alert(0 === ""); // false alert(0 === false); // false alert("" === false); // false
먼저 ===에 대해 알아보겠습니다. 구체적인 비교 규칙은 다음과 같습니다.
1. 유형이 다를 경우 [같지 않음]
2. 둘 다 숫자 값이고 동일한 값이면 [같음]이고, (!Exception) 중 적어도 하나가 NaN이면 [같지 않음]입니다. (값이 NaN인지 확인하려면 isNaN()만 사용하면 됩니다.)
3. 둘 다 문자열이고 각 위치의 문자가 동일하면 [같음]이고, 그렇지 않으면 [같지 않음]입니다.
4. 두 값이 모두 참이거나, 둘 다 거짓이면 [같음]입니다.
5. 두 값이 모두 동일한 개체나 함수를 참조하는 경우 [같음]이고, 그렇지 않으면 [같지 않음]입니다.
6. 두 값이 모두 null이거나 둘 다 정의되지 않은 경우 [같음]입니다.
==에 대한 구체적인 비교 규칙은 다음과 같습니다.
1. 두 값 유형이 동일한 경우 === 비교를 수행합니다.
2. 두 값 유형이 다른 경우에는 동일할 수 있습니다. 다음 규칙에 따라 유형 변환 및 비교를 수행합니다.
a. 하나는 null이고 다른 하나는 정의되지 않은 경우 [equal]입니다.
b. 하나는 문자열이고 다른 하나는 숫자 값인 경우 문자열을 숫자 값으로 변환한 후 비교합니다.
c. 값이 참이면 1로 변환하고, 거짓이면 0으로 변환하여 비교합니다.
d. 하나는 객체이고 다른 하나는 숫자값이나 문자열인 경우 객체를 기본형의 값으로 변환한 후 비교한다. 객체는 toString 또는 valueOf 메소드를 사용하여 기본 유형으로 변환됩니다. JS 핵심 내장 클래스는 toString 전에 valueOf를 시도합니다. 예외는 toString 변환을 사용하는 Date입니다. Non-js 핵심 객체, Ling Shuo (더 귀찮고 잘 이해가 안 되네요)
e. 다른 조합(배열 배열 등)은 [같지 않음]입니다.