JavaScript에서 객체에 특정 키(속성)가 존재하는지 확인하는 방법은 여러 가지가 있습니다. 그중 가장 널리 사용되는 두 가지 방법은 'in' 연산자와 hasOwnProperty() 메서드입니다.
먼저 아래와 같은 'employee' 객체가 있다고 가정해 보겠습니다.
var employee = {
name: "Ranjan",
age: 25
}이제 employee 객체에 'name' 속성이 존재하는지 확인해 보겠습니다.
1) 'in' 연산자
'in' 연산자를 사용하면 객체의 속성 존재 여부를 간단하게 확인할 수 있습니다. 주의할 점은 'in' 연산자가 객체 자체의 속성을 찾지 못할 경우 상속된 속성까지 함께 검사한다는 것입니다.
다음 예제에서 'toString'의 존재 여부를 확인하면, 'in' 연산자는 먼저 객체 자체의 속성들을 살펴봅니다. 해당 속성이 없다는 것을 확인한 후에는 객체의 기본(프로토타입) 속성으로 검사 범위를 넓히는데, 'toString'은 모든 객체가 상속받는 기본 속성이므로 결과로 true가 출력됩니다.
예제
<html>
<body>
<script>
var employee = {
name: "Ranjan",
age: 25
}
document.write("name" in employee);
document.write("</br>");
document.write("salary" in employee);
document.write("</br>");
document.write("toString" in employee);
</script>
</body>
</html>실행 결과
true false true
위 결과에서 볼 수 있듯이, 객체에 직접 정의된 'name'은 true, 존재하지 않는 'salary'는 false, 그리고 상속된 속성인 'toString' 역시 true를 반환합니다.
2) hasOwnProperty() 메서드
hasOwnProperty() 메서드는 객체 자체가 가진 고유 속성만 검사하며, 상속된 속성은 확인하지 않습니다. 따라서 프로토타입 체인에 존재하는 속성은 false를 반환합니다.
다음 예제에서는 상속된 속성인 'toString'까지 함께 검색했기 때문에 결과가 false로 출력됩니다.
예제
<html>
<body>
<script>
var employee = {
name: "Ranjan",
age: 25
}
document.write(employee.hasOwnProperty('toString'));
document.write("</br>");
document.write(employee.hasOwnProperty('name'));
document.write("</br>");
document.write(employee.hasOwnProperty('salary'));
</script>
</body>
</html>실행 결과
false true false
두 방법의 차이점 정리
- 'in' 연산자: 객체 자체의 속성과 상속된 속성을 모두 검사합니다.
- hasOwnProperty(): 객체 자체의 고유 속성만 검사하고 상속된 속성은 무시합니다.
따라서 프로토타입 체인의 영향을 받지 않고 순수하게 객체 자신의 속성만 확인하고 싶다면 hasOwnProperty()를, 상속된 속성까지 포함하여 확인하고 싶다면 'in' 연산자를 사용하는 것이 좋습니다.