5. == vs === vs typeof
== (double equals)
equality operator
느슨한 동등 비교
강제 형변환(type coercion: 동등 연산자로 비교하기 전에 피연산자들을 공통 타입(common type)으로 만드는 행위) 수행
1
2
3
426 == '26'
// true
// 타입은 다르지만 값은 같음1
2
3
4
5false == 0
// true
// 자바스크립트의 falsy 값
// 0을 강제로 false로 변환
=== (triple equals)
identity/strict equality operator
엄격한 동등성 비교 => 타입, 값 둘 다 같아야 함
1
2
3
426 === 26
// true
//'숫자'라는 타입도 같고 '26'라는 값도 같음1
2
3
426 === '26'
// false
// 숫자 타입 vs 문자열 타입==
보다===
을 써야하는 이유- 많은 상황에서
===
을 쓰는 것이 더 안전하고,===
을 쓰기로 결정했다면 모든 곳에서===
을 쓰는 것으로 통일 시켜라. - 동등성을 확인할 때마다
==
또는===
을 사용할지 여부를 생각하거나, 항상===
를 사용하는 습관을 들이자. ===
보다==
을 사용할 이유는 거의 없다. 만약 true와 false를 비교하려하고 강제 형변환(예: 0 또는 ‘’을 false로 반환하려는 경우)을 원하면 if(empty_str == false) 대신 if(!empty_str)을 사용해라.
- 많은 상황에서
typeof
MDN : “typeof 연산자는 평가되지 않은 피연산자의 유형을 나타내는 문자열을 반환한다.”
사용법
typeof
는 단항 연산자이므로 연산자 뒤에 피연산를 바로 쓰면 된다. 추가적인 부호(예: .)는 필요없다.1
2typeof 5
// "number"typeof
연산자는 함수가 아니다. 괄호로 피연사자를 묶을 수 있어서 함수 호출처럼 보이지만 괄호는 단지 피연산자를 묶어주는 역할만 한다. 실제로 연산자를 손상시키지 않고 모든 방식의 부호로 피연산자를 꾸밀 수 있다.1
2
3
4
5typeof (4)
// "number"
typeof (2+3)
// "number"typeof
는 완전히 구별적이지않다. 함수이외의 다른 객체들에 적용하면 “object”를 반환한다. 일반 객체와 다른 내장 타입을 구분하지 않는 것이다.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22//First type Checking works fine
var person = {
getFirstName: function () {
console.log(‘chisom’);
}
};
if (typeof person === ‘object’) {
person.getFirstName();
// this works fine just like our expectation
}
//Second type Checking throw an Exception..
var person = [];
if (typeof person === ‘object’) {
person.getFirstName();
//person.getFirstName is not a function
}두 번째 예시의 경우 typeof가 실패하는 것을 볼 수 있는데, 배열인
person
을 순수한 객체인지 확인하고있기 때문이다.
이럴때는Object.prototype.toString.call()
을 사용하면 모든 타입을 알아낼 수 있다.1
2Object.prototype.toString.call([])
// "[object Array]"