자바스크립트의 동등 비교 연산자에는 ==와 ===가 존재한다. 하지만 ==와 ===는 다르게 동작한다.
동등 연산자 ==는 두 개의 피연산자가 동일한지 확인하며, Boolean 값을 반환한다. 엄격한 일치 연산자 ===와는 다르게 다른 타입의 피연산자들끼리의 비교를 시도한다.
동등 연산자 ==는 두 피연산자를 비교하기 위해 Abstract Equality Comparison Algorithm를 사용한다. 이 알고리즘에 대해 간략하게 설명하면 아래와 같다.
null이고 다른 하나가 undefined일 때, true를 반환한다.Boolean일 경우valueOf()나 toString()을 사용해 기본 데이터 타입으로 변환하도록 한다.String: 두 피연산자의 문자 순서가 동일한 문자열일 경우, true를 반환한다.Number: 두 피연산자가 동일한 값을 가질 경우, true를 반환한다. +0과 -0은 동일한 값으로 취급한다. 어느 한쪽이 NaN일 경우, false를 반환한다.Boolean: 두 피연산자가 모두 true이거나, 모두 false일 경우, true를 반환한다.아래 코드는 동등 연산자 ==가 타입변환 없이 비교하는 예시이다.
1 == 1 // true
'hello' == 'hello' // true
아래 코드는 동등 연산자 ==가 타입변환을 이용해서 비교하는 예시이다.
// 문자열을 숫자로 변환하여 비교
"1" == 1; // true
// false를 0으로 변환하여 비교
0 == false; // true
0 == null; // false
0 == undefined; // false
// !!null => !true => false => 0
0 == !!null; // true
// !!undefined => !true => false => 0
0 == !!undefined; // true
null == undefined; // true
const number1 = new Number(3);
const number2 = new Number(3);
// number1.toString() => '3'
number1 == 3; // true
// 두 피연산자가 동일한 객체를 참조하지 않음
number1 == number2; // false
const object1 = {"key": "value"};
const object2 = {"key": "value"};
// 두 피연산자가 동일한 객체를 참조하지 않음
object1 == object2 // false
object2 == object2 // true
new String()으로 생성한 문자열들은 객체이다. 문자열과 비교하는 경우 String 객체가 문자열로 변환된 후 비교된다. 두 피연산자가 모두 String 객체인 경우 객체로써 비교가 이루어지기 때문에 같은 객체를 참조해야 같은 값으로 취급된다.
const string1 = "hello";
const string2 = String("hello");
const string3 = new String("hello");
const string4 = new String("hello");
console.log(string1 == string2); // true
console.log(string1 == string3); // true
console.log(string2 == string3); // true
console.log(string3 == string4); // false
console.log(string4 == string4); // true
엄격한 일치 연산자 ===는 두 피연산자가 같은지 여부를 확인하고, Boolean 결과를 반환한다. 동등 연산자 ==와는 다르게, 엄격한 일치 연산자 ===는 피연산자들의 타입이 서로 다른지를 항상 확인한다.
엄격한 일치 연산자는 IsStrictlyEqual 시맨틱을 제공한다.
false를 반환한다.true를 반환한다.null이거나 undefined인 경우, true를 반환한다.NaN이면, false를 반환한다.+0과 -0은 같은 값으로 취급한다.true거나 false여야 한다.아래 코드는 엄격한 일치 연산자 ===가 같은 타입의 피연산자들을 비교하는 예시이다.
"hello" === "hello"; // true
"hello" === "hola"; // false
3 === 3; // true
3 === 4; // false
true === true; // true
true === false; // false
null === null; // true
아래 코드는 엄격한 일치 연산자 ===가 다른 타입의 피연산자들을 비교하는 예시이다.
"3" === 3; // false
true === 1; // false
null === undefined; // false
3 === new Number(3); // false
아래 코드는 엄격한 일치 연산자 ===가 객체를 비교하는 예시이다.
const object1 = {
key: "value",
};
const object2 = {
key: "value",
};
console.log(object1 === object2); // false
console.log(object1 === object1); // true
동등 연산자 ==와 엄격한 일치 연산자 ===의 가장 두드러지는 차이점은 다음과 같다.
false를 반환한다.수업을 들으면서 두 피연산자를 비교할 때는 동등 연산자 사용을 지양하고, 엄격한 일치 연산자를 항상 지향해야 한다는 점을 배웠는데, 오늘 이 내용을 공부하면서 이 점에 대해 훨씬 더 잘 이해할 수 있었다.