HOME
NOTE

[Javascript] Object.is()

CREATED
2025. 3. 24. 오전 7:09:21
UPDATED
2025. 3. 24. 오전 7:55:08
TAGS
#Javascript

Object.is()는 두 값이 같은 값인지 알려준다.

출처는 MDN
// Case 1: 평가 결과는 ===을 사용한 것과 동일합니다
Object.is(25, 25); // true
Object.is("foo", "foo"); // true
Object.is("foo", "bar"); // false
Object.is(null, null); // true
Object.is(undefined, undefined); // true
Object.is(window, window); // true
Object.is([], []); // false

const foo = { a: 1 };
const bar = { a: 1 };
const sameFoo = foo;
Object.is(foo, foo); // true
Object.is(foo, bar); // false
Object.is(foo, sameFoo); // true

// Case 2: 부호 있는 0
Object.is(0, -0); // false
Object.is(+0, -0); // false
Object.is(-0, -0); // true

// Case 3: NaN
Object.is(NaN, 0 / 0); // true
Object.is(NaN, Number.NaN); // true

다음 중 하나를 만족하면 두 값은 같다.

  • 둘 다 undefined
  • 둘 다 null
  • 둘 다 true 또는 둘 다 false
  • 둘 다 같은 문자열
  • 둘 다 같은 객체(메모리 참조가 같음을 의미)
  • 둘 다 같은 숫자(+0-0을 다르다고 봄)
  • 둘 다 NaN
📌 동등 연산자와 같지 않다.

== 연산자는 서로 형(type)이 같지 않다면 강제로 형 변환을 하는 것과 달리 Object.is()는 어떤 변환도 하지 않는다.

📌 일치 연산자와도 같지 않다.

=== 연산자는 +0-0을 같다고 본다. 한편 NaN을 서로 비교할 때 다르게 처리한다.

실무 코드에서도 Object.is()를 종종 목격할 수 있다.

바닐라로 작성된 zustand store 생성 함수

const createStoreImpl = (createState) => {
  let state;
  const listeners = /* @__PURE__ */ new Set();
  const setState = (partial, replace) => {
    const nextState = typeof partial === "function" ? partial(state) : partial;
    if (!Object.is(nextState, state)) {
      const previousState = state;
      state = (
        replace != null
          ? replace
          : typeof nextState !== "object" || nextState === null
      )
        ? nextState
        : Object.assign({}, state, nextState);
      listeners.forEach((listener) => listener(state, previousState));
    }
  };
  const getState = () => state;
  const getInitialState = () => initialState;
  const subscribe = (listener) => {
    listeners.add(listener);
    return () => listeners.delete(listener);
  };
  const api = { setState, getState, getInitialState, subscribe };
  const initialState = (state = createState(setState, getState, api));
  return api;
};
const createStore = (createState) =>
  createState ? createStoreImpl(createState) : createStoreImpl;

export { createStore };

참고