[JS] 두 객체가 같은 내용인지 판단하는 방법은 무엇일까?

ssumniee·2021년 8월 25일
0

🤔 QnA

목록 보기
3/5

동일한 주소값을 갖는가?

객체는 참조자료형이다. 따라서 변수 내용을 참조해오는 주소를 값으로 갖는다.
이 주소가 동일하다면 두 객체는 하나의 주소에서 동일한 내용을 참조하기 때문에 반드시 같은 내용을 갖는다.

동일한 주소를 갖는 두 객체의 비교

// obj1, obj2 비교
if(obj1 === obj2) {
  // 두 객체는 같은 주소값을 갖기 때문
  console.log(`${obj1}${obj2}는 같은 내용입니다.`);
}

주소값이 다르다면?

주소값이 다른 두 객체를 비교하는 경우, 객체 내부의 속성 & 속성값 이 전부 일치해야만 같은 내용이라고 할 수 있다.

Object.keys() 메소드를 통해 객체 내부의 속성 들을 조회한 뒤, 각각의 속성 & 속성값 들을 조회, 비교하여 내용의 일치 여부를 판단한다.

  • 객체가 원시자료형 속성값만 갖는 경우
    • 비교연산자를 사용한 일반적인 방법으로 속성값을 비교한다.
  • 객체가 참조자료형 속성값을 갖는 경우
    • 해당 속성값의 주소가 동일한지 비교한다.
    • 주소가 다르다면, 해당 속성값 내부의 속성 & 속성값 을 전부 비교한다.

원시자료형 속성값만을 갖는 서로 다른 두 객체의 비교

// obj1, obj2 비교
if(obj1 !== obj2) {
  const keys1 = Object.keys(obj1); // obj1 객체의 속성들을 담은 배열
  const keys2 = Object.keys(obj2); // obj2 객체의 속성들을 담은 배열
  
  // 두 keys 배열의 길이가 다르면
  if(keys1.length !== keys2.length) {
  	// 두 객체의 속성이 일치하지 않기 때문
    console.log(`${obj1}${obj2}는 다른 내용입니다.`);	
  }
  
  // keys 배열 중 하나의 요소 순회
  for(let key of keys) {
    // obj1과 obj2의 key 속성값이 다르면
    if(obj1[key] !== obj2[key]) {
      // obj1과 obj2의 속성값이 일치하지 않기 때문
      console.log(`${obj1}${obj2}는 다른 내용입니다.`);
    }
  }
  
  // (keys 요소 순회 종료 후)
  // obj1과 obj2의 모든 속성과 속성값이 일치하기 때문
  console.log(`${obj1}${obj2}는 같은 내용입니다.`);
}
profile
개발에 뛰어든 UX/UI 디자이너

0개의 댓글

관련 채용 정보