shallowEquals.ts)deepEquals.ts)🔹 === (Strict Equality)
const a = { name: "Jane" };
const b = { name: "Jane" };
console.log(a === b); // false (참조값이 다름)
설명: 객체끼리는 메모리 주소(참조)를 비교합니다. 값이 같더라도 객체가 다르면 false예요.
JSON.stringify(a) === JSON.stringify(b)비교 방식: 깊은 비교처럼 보일 수 있음 (Deep-ish)
성능: 느림 (O(n))
문자열 변환과 비교가 필요해서, 구조가 복잡할수록 속도가 느려집니다.
예시:
const a = { name: "Jane" };
const b = { name: "Jane" };
console.log(JSON.stringify(a) === JSON.stringify(b)); // true
주의사항:
key 순서가 다르면 false (객체의 순서가 중요한 게 아님에도 불구하고)
순환 참조가 있으면 에러 발생 (TypeError: Converting circular structure to JSON)
| 항목 | === (Strict Equality) | JSON.stringify() |
|---|---|---|
| 비교 방식 | 얕은 비교 (Shallow Compare) | 깊은 비교처럼 보이는 문자열 비교 |
| 성능 | 매우 빠름 (O(1)) | 느림 (O(n)) — 구조 클수록 느림 |
| 비교 대상 | 참조값 | 문자열화된 구조 |
| 단점 | 값이 같아도 참조 다르면 false | key 순서 다르면 false, 순환 참조 시 에러 |
| 예시 | a === b // false | JSON.stringify(a) === JSON.stringify(b) // true |
| 항목 | 얕은 비교 | 깊은 비교 |
|---|---|---|
| 비교 방식 | 최상위 key 또는 참조만 비교 | 모든 내부 값까지 재귀적으로 비교 |
| 속도 | 빠름 (O(1) ~ O(n)) | 느림 (O(n^2) 가능성 있음) |
| 사용 예 | ===, Object.is, React memo, useMemo | Lodash _.isEqual, 커스텀 deepEqual 함수 |
| 적용 대상 | 단순 객체, 참조만 보면 되는 경우 | 중첩된 객체, 구조 비교가 필요한 경우 |
| 예시 | { a: 1 } === { a: 1 } // false | _.isEqual({ a: 1 }, { a: 1 }) // true |
JSON.stringify()는 비교에 쓸 수 있지만 아래 주의점이 있어요:undefined, function, symbol 등은 JSON에 포함되지 않음| 목적 | 추천 방법 |
|---|---|
| 참조 동일 여부만 확인 | === |
| 깊은 구조 비교 필요 | _.isEqual() or 커스텀 deepEqual 함수 |
| 문자열 저장/전송 | JSON.stringify() (비교 목적엔 적합하지 않음) |