== (double equals)

  • equality operator

  • 느슨한 동등 비교

  • 강제 형변환(type coercion: 동등 연산자로 비교하기 전에 피연산자들을 공통 타입(common type)으로 만드는 행위) 수행

    1
    2
    3
    4
    26 == '26'
    // true

    // 타입은 다르지만 값은 같음
    1
    2
    3
    4
    5
    false == 0
    // true

    // 자바스크립트의 falsy 값
    // 0을 강제로 false로 변환

=== (triple equals)

  • identity/strict equality operator

  • 엄격한 동등성 비교 => 타입, 값 둘 다 같아야 함

    1
    2
    3
    4
    26 === 26
    // true

    //'숫자'라는 타입도 같고 '26'라는 값도 같음
    1
    2
    3
    4
    26 === '26'
    // false

    // 숫자 타입 vs 문자열 타입
  • ==보다 ===을 써야하는 이유

    1. 많은 상황에서 ===을 쓰는 것이 더 안전하고, ===을 쓰기로 결정했다면 모든 곳에서 ===을 쓰는 것으로 통일 시켜라.
    2. 동등성을 확인할 때마다 == 또는 ===을 사용할지 여부를 생각하거나, 항상 ===를 사용하는 습관을 들이자.
    3. ===보다 ==을 사용할 이유는 거의 없다. 만약 true와 false를 비교하려하고 강제 형변환(예: 0 또는 ‘’을 false로 반환하려는 경우)을 원하면 if(empty_str == false) 대신 if(!empty_str)을 사용해라.

typeof

MDN : “typeof 연산자는 평가되지 않은 피연산자의 유형을 나타내는 문자열을 반환한다.”

  • 사용법

    • typeof는 단항 연산자이므로 연산자 뒤에 피연산를 바로 쓰면 된다. 추가적인 부호(예: .)는 필요없다.

      1
      2
      typeof 5
      // "number"
    • typeof연산자는 함수가 아니다. 괄호로 피연사자를 묶을 수 있어서 함수 호출처럼 보이지만 괄호는 단지 피연산자를 묶어주는 역할만 한다. 실제로 연산자를 손상시키지 않고 모든 방식의 부호로 피연산자를 꾸밀 수 있다.

      1
      2
      3
      4
      5
      typeof (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
      2
      Object.prototype.toString.call([])
      // "[object Array]"