_isEqual() 메서드란?
_isEqual()은 JavaScript의 underscore 및 lodash 라이브러리에서 제공하는 유틸리티 메서드로, 두 개의 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()이 가장 확실한 방법입니다.