모던 리액트 Deep Dive - 자바스크립트의 동등 비교

2025. 9. 15. 21:52·Study/모던 리액트 Deep Dive

⚡리액트 개발을 위해 꼭 알아야할 자바스크립트 - 1.1 자바스크립트의 동등 비교

리액트 코드의 기반이 되는 자바스크립트에 대해 먼저 알아보자!

1.1.1 자바스크립트의 데이터 타입

  • 자바스크립트의 모든 값은 데이터 타입을 갖고 있으며, 데이터 타입은 크게 원시타입과 객체타입으로 나눠진다.

💡데이터 타입

원시타입(private type) 객체타입(object/reference type)
boolean
null
undefined
number
string
symbol
bigint
object

💡참고할 사이트

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects

 

표준 내장 객체 - JavaScript | MDN

아래 전역 속성은 간단한 값을 반환하며 속성이나 메서드를 가지고 있지 않습니다. 객체에 붙지 않고 전역으로 호출하는 함수로, 반환 값을 호출자에게 바로 반환합니다. 다른 모든 객체의 기반

developer.mozilla.org

1. 원시타입

  • 객체가 아닌 모든 타입을 의미하며, 메서드를 갖지 않음

🌓 undefined

  • 선언한 후 값을 할당하지 않는 변수 또는 값이 주어지지 않는 인수에 자동으로 할당되는 값
let foo
typeof foo === 'undefined' //true

funtion bar(hello){
	return hell0
}
typeof bar() == 'undefined' //true
  • null과 undefined는 오직 각각 null과 undefined라는 값만 가질 수 있으며, 그 밖의 타입은 가질 수 있는 값이 두개 이상 (boolean의 true,false) 존재한다.

🌓 null

  • 아직 값이 없거나 비어있는 값을 표현할 때 사용
typeof null === 'object' //true?
  • null이 가지고 있는 특별한 것은 다른 원시값과 다르게 typeof로 null을 확인했을 때 해당 타입이 아닌 'object'라는 결과가 반환된다는 것
undefined : 선언되었지만 할당되지 않는 값
null : 명시적으로 비어있음을 나타내는 값

🌓 Boolean

  • true와 false만을 가질 수 있는 데이터 타입 ( falsy와 truthy 값이 존재)
  • 조건문에서 많이 쓰이는 데이터 타입

💡 falsy가 가능한 값의 실제 타입

값 타입 설명
false Boolean false는 대표적인 falsy한 값이다.
0,-0,0n,0x0n Number, BigInt 0는 부호나 소수점 유무에 상관없는 falsy한 값이다.
NaN Number Number가 아니라는 것을 뜻하는 NaN은 falsy한 값이다.
'',"",`` String 문자열이 falsy하기 위해서는 반드시 공백이 없는 빈 문자열이어야 한다.
null null null은 falsy한 값이다.
undefined undefined undefined는 falsy한 값이다.

💡  truthy

  • 조건문 내부에서 true로 취급되는 값
  • 객체와 배열은 내부에 값이 존재하는 지 여부와 상관없이 truthy로 취급된다. 즉, {},[] 모두 truthy한 값

🌓Number

  • 자바스크립트는 정수와 실수를 구분하지 않고, 모든 숫자를 하나의 타입에 저장

🌓 BigInt

  • number가 다룰수 있는 숫자 크기의 제한을 극복하기 위해 출현

🌓 String 

  • 텍스트 타입의 데이터를 저장하기 위해 사용
  • 원시타입이며, 한번 문자열이 생성되면 그 문자열은 변경할 수 없음
  • 백틱(``)을 사용한 문자열은 템플릿 리터럴이라고 하며, 같은 문자열을 반환하지만 줄바꿈이 가능하고, 문자열 내부에 표현식을 쓸 수 있다.

🌓 Symbol

  • ES6에 추가된 타입이며, 중복되지 않는 고유한 값을 나타내기 위해 만들어짐
  • Symbol을 생성하려면 반드시 Symbol()함수를 이용해서만 만들수 있다.
  • 동일한 값을 사용하기 위해서는 Symbol.for를 활용함
const key = Symbol('key')
const key2 = Symbol('key')

key === key2 //false
Symbol.for('hello') === Symbol.for('hello') //true

2. 객체타입 (object type)

  • 자바스크립트를 이루고 있는 대부분의 타입(배열, 함수, 정규식, 클래스 등)
  • 참조를 전달한다고 해서 참조타입(reference type)으로도 불림

1.1.2 값을 저장하는 방식의 차이

원시타입과 객체타입의 차이점은 값을 저장하는 방식이 다르다는 점이다!
  • 원시타입은 불변 형태의 값으로 저장되며, 해당 값은 변수 할당 시점에 메모리 영역을 차지하고 저장된다.
  • 객체타입은 프로퍼티를 삭제,추가,수정할 수 있으므로 원시 값과 다르게 변경 가능한 형태로 저장되며, 값을 복사할 때도 값이 아닌 참조를 전달하게 된다.

1.1.3 자바 스크립트 또 다른 비교 공식, Object.js

🌚 Object.js

  • 자바스크립트에서 비교를 위한 방법이며, 두개의 인수를 받고 해당 인수가 동일할지 확인하고 반환하는 메서드이다.

Object.js가 ==나 ===와 다른점은 아래와 같다.

💡 == vs Object.js 

  • == (동등 연산자) : 타입이 다르면 형 변환(type coercion) 후 비교
  • Object.is() : 형 변환을 하지 않는다.
5 == '5' 와 같이 형변환 후에 값이 동일하다면 ==는 true를 반환하지만, Object.js는 형변환을 하지 않는다.
즉, ===와 동일하게 타입이 다르면 그냥 false이다.

💡 === vs Object.js 

  • === (일치 연산자) : 타입 변환을 하지 않고 값과 타입을 동시에 비교
  • Object.is() : ===와 유사하지만, 보다 더 정밀한 비교 (특히 NaN, +0 vs -0 구분할 때 필요)
-0 === +0 // true
Object.is(-0, +0) // false

Number.NaN === NaN // false
Object.is(Number.NaN, NaN) // ture

NaN === 0 / 0 // false
Object.is(NaN, 0 / 0) // true

※ Object.is() 사용시 주의해야 할 점 : 객체 비교에는 별 차이가 없다.

Object.is({}, {}) // false

const a = {
  hello: 'hi',
}
const b = a

Object.is(a, b) // true
a === b // true

1.1.4 리액트에서의 동등비교 

  • 리액트에서 사용하는 동등비교는 Object.is()이며, ==나 ===가 아니다.

💡 리액트에서 실제로 값을 비교할 때 사용하는 코드

https://github.com/facebook/react/blob/main/packages/shared/objectIs.js

 

react/packages/shared/objectIs.js at main · facebook/react

The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.

github.com

//any는 어떠한 값도 받을 수 있는타입을 의미
function is(x: any, y: any) {
  return (
    (x === y && (x !== 0 || 1 / x === 1 / y)) || (x !== x && y !== y) 
  );
}
//런타임에 object.js가 있다면 사용하고, 아니면 위 함수를 사용한다.
const objectIs: (x: any, y: any) => boolean =
  typeof Object.is === 'function' ? Object.is : is;

export default objectIs;

💡 shallowEqual

  • objectIs를 기반으로 동등비교하는 함수이며, 의존성 비교등 리액트의 동급 비교가 필요한 곳에서 사용

https://github.com/facebook/react/blob/main/packages/shared/shallowEqual.js

 

react/packages/shared/shallowEqual.js at main · facebook/react

The library for web and native user interfaces. Contribute to facebook/react development by creating an account on GitHub.

github.com

  • 리액트에서는 Object.is로 먼저 비교를 수행한 후, Object.is에서 수행하지 못한 비교 즉, 객체 간 얕은 비교를 한 번 더 수행한다는 것을 알 수 있다. (객체 간 얕은 비교 : 객체의 첫 번째 깊이에 존재하는 값만 비교한다는 것)
// Object.is는 참조가 다른 객체에 대해 비교가 불가능
Object.is({ hello: 'world' }, { hello: 'world' }) // false

// shallowEqual은 객체의 1 depth까지는 비교 가능
shallowEqual({ hello: 'world' }, { hello: 'world' }) // true

// 그러나 2 depth까지 가면 이를 비교할 방법이 없으므로 false 반환
shallowEqual({ hello: { hi: 'world' } }, { hello: { hi: 'world' } }) // false

→ 객체 간 얕은 비교까지만 구현한 이유는 리액트는 JSX props는 객체이고,props만 일차적으로 비교하면 되기 때문

 

'Study > 모던 리액트 Deep Dive' 카테고리의 다른 글

모던 리액트 Deep Dive - 이벤트 루프와 비동기 통신의 이해  (0) 2025.09.23
모던 리액트 Deep Dive - 클로저  (1) 2025.09.15
모던 리액트 Deep Dive - 클래스  (0) 2025.09.15
모던 리액트 Deep Dive - 함수  (0) 2025.09.15
모던 리액트 Deep Dive - 들어가기 전  (0) 2025.09.15
'Study/모던 리액트 Deep Dive' 카테고리의 다른 글
  • 모던 리액트 Deep Dive - 클로저
  • 모던 리액트 Deep Dive - 클래스
  • 모던 리액트 Deep Dive - 함수
  • 모던 리액트 Deep Dive - 들어가기 전
happy_dev
happy_dev
복사하고 붙여넣기 잘하고 싶어요
  • happy_dev
    happy의 개발일지
    happy_dev
  • 전체
    오늘
    어제
    • 전체 (43)
      • Java (0)
      • React (1)
      • DB (1)
      • Study (41)
        • 친절한 SQL 튜닝 (9)
        • 모던 리액트 Deep Dive (18)
        • 젠킨스로 배우는 CI,CD 파이프라인 구축 (14)
        • Studyd (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Jenkins
    젠킨스
    인덱스의기본
    리액트
    DB
    SQL
    조인
    toad
    oracle
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
happy_dev
모던 리액트 Deep Dive - 자바스크립트의 동등 비교
상단으로

티스토리툴바