logo

이중 등호 vs 삼중 등호 vs typeof

Chapter 5

40 조회

0 추천

665 단어

4분 예상

2024. 08. 15. 게시

2025. 02. 28. 수정

luasenvy 작성

CC BY-NC-SA 4.0

이중 등호와 삼중 등호

// 값만을 비교할지 자료형까지 비교할지 구분하여 사용할 수 있다.
const doubleEquals = "1" == 1;  // true
const tripleEquals = "1" === 1; // false

typeof

console.log(typeof "1");       // string
console.log(typeof 1);         // number
console.log(typeof true);      // boolean
console.log(typeof undefined); // undefined

console.log(typeof {});        // object
console.log(typeof []);        // object
console.log(typeof null);      // object

자료형을 반환하는 내장함수로 typeof()가 있다. 괄호를 생략하여 사용할 수도 있으며 동작에 차이점은 없다. 기본 자료형Primitive Values의 경우 비교적 직관적이게 작동하지만 이외의 자료형인 Object를 다룰때에는 극심한 스트레스를 동반할 수 있다. 객체를 다룰 때에도 object만 반환할 뿐이기 때문에 과거에는 직접 다른 방법으로 구현을 하여 사용하는 것이 일반적이었다.

class MyObject {
  constructor() {
    this.name = "i'm instance!";
  }
}

const obj1 = new MyObject();
const obj2 = { name: "i'm instance!" };

간단한 예로 위 예제처럼 obj1, obj2 두개의 객체를 어떻게 구분할 것인가? 데이터로 사용하는 JSONObject와 여러 기능이 구현된 클래스 인스턴스를 둘다 사용할 때 아주 심심치 않게 마주치는 문제이다.

typeof는 동일하게 object를 반환할 것이고 멤버로 접근하는 방법 역시 동일하기 때문에 구분할 방법이 없다. instanceof를 사용한다면 두 객체는 구분이 가능하겠지만 MyObject에 국한되지 않고 다른 클래스를 가지는 객체와 구분해 내고 싶다면 코드가 멍청해질 수 밖에 없다. 인기있는 유틸리티 라이브러리 lodash 등만 보아도 아직 그 고통의 상처들이 남아있는데 _.isPlainObject()와 같은 함수들이 그 고난들을 대변하고 있다.

lodash/main/lodash.js#isPlainObject()

클래스 객체와 일반 객체를 구분하기위해 멤버변수를 확인하고 "[object Object]" 를 비교하는 모습을 볼 수 있다. 이 글을 작성하는 시점이 2024년이지만 300명 가까이 기여된 60k급 글로벌 유틸리티 라이브러리조차 여전히 이 둘을 구분해 내는 깨끗하고 뾰족한 수를 찾지 못한 모습이다. 그래도 자바스크립트의 버전이 올라가면서 Array.isArray() 메서드처럼 특정한 객체 유형을 확실하게 구분할 수 있는 방법이 추가되기도 하기때문에 이런 어려움들도 하나씩 줄어들 것이라는 희망이 있다.