Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript _isEqual() 메서드 완벽 정리: 객체 비교가 중요한 이유

_isEqual() 메서드란?

_isEqual()은 JavaScript의 underscorelodash 라이브러리에서 제공하는 유틸리티 메서드로, 두 개의 JavaScript 객체를 비교할 때 사용됩니다.

이 메서드가 주목받는 핵심적인 이유는 객체를 비교할 때 속성(property)의 순서를 전혀 고려하지 않는다는 점입니다. 즉, 두 객체에 담긴 속성과 값이 동일하기만 하면 순서가 다르더라도 같은 객체로 판단합니다.

반면, 객체 비교에 흔히 사용되는 JSON.stringify()는 객체를 문자열로 변환한 뒤 비교하기 때문에 속성의 선언 순서까지 일치해야만 true를 반환합니다. 이러한 차이 때문에 실무에서는 _isEqual()이 훨씬 안정적이고 신뢰할 수 있는 선택지로 꼽힙니다.

문법(Syntax)

_.isEqual(object1, object2);

_isEqual()은 두 개의 객체를 매개변수로 받아, 두 객체가 깊은 수준(deep)에서 동일한지 여부를 검사하고 그 결과를 불리언 값으로 반환합니다.

예제 1: 동일한 객체 비교

<html>
<head>
<script src =
    "https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js">
</script>
</head>
<body>
<script>
    var obj1 = {name: "Sikha", designation: "Content developer"};
    var obj2 = {name: "Sikha", designation: "Content developer"};
    document.write(_.isEqual(obj1, obj2));
</script>
</body>
</html>

출력 결과

true

위 예제에서 두 객체는 이름과 직위 속성이 완전히 같으므로 _isEqual()은 true를 반환합니다.


예제 2: 속성 순서가 다른 객체 비교

다음 예제에서는 JSON.stringify()_isEqual()을 함께 사용하여 두 방식의 차이를 보여줍니다. _isEqual()은 속성 순서를 무시하기 때문에 true를 출력하지만, JSON.stringify()는 속성 순서까지 검사하기 때문에 false를 출력합니다.

<html>
<head>
<script src =
    "https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js">
</script>
</head>
</body>
<script>
    var obj1 = {name: "Sikha", designation: "Content developer"};
    var obj2 = {designation: "Content developer", name: "Sikha"};
    document.write(_.isEqual(obj1, obj2));
    document.write("</br>");
    document.write(JSON.stringify(obj1) === JSON.stringify(obj2));
</script>
</body>
</html>

출력 결과

true
false

JSON.stringify() 대신 _isEqual()을 사용해야 하는 이유

JSON.stringify() 기반 비교에는 몇 가지 함정이 있습니다.

첫째, 속성 순서 의존성. JSON.stringify()는 객체를 문자열로 변환하며, 이때 속성의 삽입 순서가 문자열 결과에 반영됩니다. 따라서 내용이 완전히 같은 두 객체도 순서만 다르면 비교 결과가 false가 됩니다.

둘째, 값 누락 문제. JSON.stringify()는 undefined, 함수(function), 심볼(Symbol) 값을 자동으로 제외합니다. 이런 값들이 객체에 포함되어 있으면 비교 결과가 왜곡될 수 있습니다.

반면 _isEqual()은 내부적으로 재귀 방식의 깊은 비교(deep equality check)를 수행하므로, 중첩된 객체나 배열 구조까지 정확하게 비교해 줍니다. 객체의 실질적인 동등성을 판단해야 하는 경우라면 _isEqual()이 가장 확실한 방법입니다.