==, === 둘 다 비교연산자이다.
1. == (동등 연산자)
- loose equality 연산자.
- 두 개의 피연산자가 동일한지 확인하며, boolean 결과를 반환한다.
- 비슷해보이면 같다고 판단한다.
- 데이터 유형을 엄격하게 검사하지 않고, 필요한 경우 자동으로 형 변환을 수행한다.
- ex)
1 == '1' // true
0 == false // true
상세 설명
1. 두 피연산자가 동일한 타입일 경우 다음과같이 비교한다.
- 객체 : 두 피연산자가 동일한 객체를 참조할때만 true.
/* 객체타입 비교 예시 */
const object1 = {
key: "value",
};
const object2 = {
key: "value",
};
object1 == object2 // false
object1 == object1 // true
아래는 number object이기때문에 같은 값이지만 같은 객체를 참조하고있지 않기때문에 false.
const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3; // true
number2 == 3; //true
number1 == number2; // false
- 문자열 : 두 피연산자가 동일한 문자를 동일한 순서로 가질때만 true
- 숫자 : 두 피연산자가 동일한 값을 가질때만 true. 만약 두 연산자 모두 NaN이라면 false.(NaN은 항상 NaN과 다르다.)
- boolean : 두 피연산자가 동일한 값을 가질 때만 true
- 심볼 : 두 피연산자가 동일한 심볼을 참조할 때만 true
2. 두 피연산자가 동일한 타입이 아닐경우 다음과 같이 비교한다.
- 하나의 피연산자가 null이거나 undefined인 경우 : 다른 하나가 무조건 null 이거나 undefined여야 true.
null == undefined // true
0 == null // false
0 == undefined // false
0 == !!null // true
0 == !!undefined // true
- 하나의 피연산자가 객체이고, 다른하나가 원시타입인경우, 객체를 원시타입으로 변환
- 하나의 피연산자가 심볼이라면 다른 하나도 심볼이어야만 true
- 하나의 연산자가 boolean이고, 다른 하나가 boolean이 아닌 경우, boolean을 숫자로 변환(true = 1, false = 0)
0 == false // true
- 숫자와 문자열 : 문자열을 숫자로 변환. 변환실패의 경우 결과값은 NaN이므로 false.
- 숫자와 BigInt : 숫자값으로 비교. 숫자가 infinity 혹은 NaN이라면 false
- 문자열과 BigInt : 문자열을 BigInt() 생성자와 같은 알고리즘으로 변환. 변환 실패시 false.
3. string과 string object의 비교
string object와 string을 비교한다면 string object가 string으로 변환된 후 비교하기때문에 같은 문자열을 가지고 있다면 true.
하지만 string object끼리 비교한다면 객체로써 비교가 이루어지기때문에 같은 참조를 가지고있어야 true이다.
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
4. Date와 string 비교
날짜타입과, 날짜타입을 문자열로 형변환한 변수는 동일하다고 본다.
const d = new Date("December 17, 1995 03:24:00");
const s = d.toString();
console.log(d == s); //true
2. === (일치연산자)
- 값과 데이터 유형을 모두 엄격하게 비교 후 boolean값을 반환한다.
- 두 값이 정확히 동일한 유형이며 값도 같아야한다.
- 데이터의 형변환이 자동으로 수행되지 않는다.
- ex)
1 ==='1' // false
0 === false // false
상세 설명
- 피연산자가 다른 유형이라면 false
3 === new Number(3); // false
- 두 피연산자가 모두 객체인 경우, 동일한 참조를 가지는 경우에만 true
- 두 피연산자가 둘 다 null이거나, 둘 다 undefined인경우 true
null === undefined; // false
- 피연산자중 하나가 NaN이라면 false 반환
결론
- 일치연산자(===)를 사용하는것이 안전하다.
- NaN의 비교를 위해서는 isNaN함수를 사용한다. (문자열의 경우 true 반환)
isNaN(NaN) // true
isNaN(1) // false
isNaN(undefined) // true
isNaN("abc") // true
참조
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Equality
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Strict_equality
'JavaScript' 카테고리의 다른 글
JavaScript - 브라우저의 동작 원리 (0) | 2023.10.01 |
---|---|
JavaScript - 얕은 복사, 깊은 복사 (0) | 2023.09.24 |
Javascript - 함수 유효범위 (0) | 2023.03.13 |
Javascript - 정규표현식 (0) | 2023.03.13 |
Javascript - UI·API , 문서 (0) | 2023.03.13 |