간단히 설명하자면, 동등 연산자== 는 데이터 타입을 확인하지 않고 값을 비교하고, 일치 연산자 === 는 같은 데이터 타입 안에서 값을 비교하는 차이가 있다.
==== 는 비교 대상을 같은 타입으로 바꾸어 비교하는, 상대적으로 관대한 비교를 한다. 이 과정에는 다음과 같은 규칙이 존재한다.
두 비교 대상의 데이터 타입이 같다면 일치 연산자 === 처럼 비교한다.
undefined == null
한쪽의 데이터 타입이 string 이고 다른 쪽은 number 라면, string 을 number 로 바꾸어 비교한다.
한쪽의 데이터 타입이 boolean 이고 다른 쪽은 non-boolean 이라면, boolean 을 number 로 바꾼 후 비교한다.
객체에서 string 타입과 number 타입을 비교할 땐, 객체를 원시자료형으로 바꾸어 비교한다.
====== 는 데이터 타입과 값을 모두 비교하는 엄격한 비교를 한다. 따라서 타입과 값이 모두 같을 때만 참을 반환하고 다르면 거짓을 반환한다.
두 문자열을 비교할 경우, 완전히 동일한 문자열을 비교해야만 참을 반환한다. string 이라는 데이터 타입만 같고 문자열 속의 글자가 한글자라도 다르다면 거짓을 반환한다.
원시자료형 타입인 number , boolean 역시 정확히 같은 값을 가지고 있어야만 참을 반환한다.
객체와 배열은 참조 자료형이므로 동등 연산자나 일치 연산자로 비교할 수 없다. 하지만 식별자 번호(배열의 경우 인덱스 넘버, 객체의 경우 속성)를 통해 내부의 각 요소들은 비교할 수 있다.
NaN, null, undefined 는 다른 모든 데이터 타입과 일치 연산자 === 를 사용해 비교했을 때 반드시 거짓을 반환한다. NaN 은 일치 연산자 === 로 자기 자신과 비교해도 거짓을 반환한다.
// number 타입과 비교
NaN === 1; // false
null === 1; // false
undefined === 1; // false
// string 타입과 비교
NaN === '1'; // false
null === '1'; // false
undefined === '1'; // false
// boolean 타입과 비교
NaN === true; // false
null === true; // false
undefined === true; // false
NaN === false; // false
null === false; // false
undefined === false; // false
// 자기 자신과 비교
NaN === NaN; // true
null === null; // true
undefined === undefined; // false