let str1 = "값1";
let str2 = "값1";
console.log(str1 === str2);// true
let arr1 = [1, 2, 3];
let arr2 = [1, 2, 3];
console.log(arr1 === arr2);// false, 참조되는 위치가 다르기 때문
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { a: 1, b: { c: 2 } };
let obj3 = { a: 1, b: { c: 3 } };
// JSON.stringify() 메서드를 사용한 경우
console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // true
console.log(JSON.stringify(obj1) === JSON.stringify(obj3)); // false, b 객체의 c 속성값이 다름
// Lodash 라이브러리의 isEqual() 메서드를 사용한 경우
import _ from 'lodash';
console.log(_.isEqual(obj1, obj2)); // true
console.log(_.isEqual(obj1, obj3)); // false, b 객체의 c 속성값이 다름
React.memo() 에서 props를 비교할 때 (React.memo() 란 무엇인가? 링크)
리액트 컴포넌트가 리렌더링을 하기 전
let str = "A";
let arr = ["A"];
위 코드에서 str
변수는 원시 자료형으로, 메모리에 아스키 코드로 변환된 문자 'A'의 값인 65를 직접 저장한다. 반면, arr
변수는 참조 자료형으로, 배열 ["A"]
가 저장되어 있는 메모리 주소를 참조한다.// 원시 자료형 메모리 상태 예시
메모리 주소 | 값
-----------|-----
0x1234 | 65 <- str 변수의 값 ('A'의 아스키 코드값)
// 참조 자료형 메모리 상태 예시
메모리 주소 | 값
-----------|-----
0x5678 | 0xABCD <- arr 변수가 참조하는 메모리 주소
// 배열의 실제 원소 값이 저장된 메모리 상태(Control Block)
메모리 주소 | 값
-----------|-----
0xABCD | 65 <- 배열 ["A"]의 원소 'A' (아스키 코드로 문자 'A'의 값인 65를 저장)
얕은 비교(Shallow Compare)는 참조 자료형의 경우 메모리 주소를 비교하기 때문에, 서로 다른 메모리 주소에 같은 값이 저장되어 있어도 다르게 인식된다. 이 때 깊은 비교(Deep Compare)를 사용하면 실제 값이 동일한지 정확하게 비교할 수 있다.