JS/Javascript

[javascript] 객체 5 / 객체 존재 여부 확인, 반복 (in 연산자, hasOwnProperty(), for...in)

ui-o 2025. 8. 21. 16:00
반응형

 in 연산자

  • 객체 또는 배열에 특정 프로퍼티(키)가 존재하는지 여부를 확인하는 연산자
  • 반환값: true 또는 false
  • 범위 : 객체 자신 + 부모(상속)
  • 값이 undefined라도 존재하면 true.
  • 배열의 경우 인덱스 존재 여부 확인 가능
// [문법]
"키이름" in 객체이름
const person = {
  name: "Alice",
  age: 25
};

console.log("name" in person); // true
console.log("gender" in person); // false

사용 예

  • 값이 없어도 in은 "존재"로 판단 → 디폴트 값 처리할 때 유용
  • 상속까지 포함 → 객체가 어디서 프로퍼티를 받았는지 신경 써야 할 때 주의
  • 배열 인덱스 체크 → sparse array(빠진 요소) 처리 가능

in연산자 특징

1. 객체 자체의 프로퍼티와 상속된 프로퍼티 모두 확인

  • in 연산자는 객체 자체의 프로퍼티뿐 아니라, 상속받은 프로퍼티도 확인
  • 자신 + 부모까지 훑어보며 키가 있는지 확인
const obj = {};
console.log("toString" in obj); // true

/*

1. obj 자체에는 toString이라는 프로퍼티가 없음
2 그런데 obj가 상속받는 부모, 즉 Object.prototype에는 toString() 메서드가 이미 존재
  Object.prototype: 자바스크립트 기본 객체가 갖고 있는 메서드들(toString, hasOwnProperty 등)
3.그래서 "toString" in obj를 물어보면,
  obj 자신에게는 없지만 부모에서 상속받았기 때문에 있다고 판단함
*/

2. 값이 undefined라도 존재하면 true

  • in은 프로퍼티 값이 undefined여도 존재 여부를 확인
const user = { name: undefined };

console.log("name" in user); // true
console.log(user.name === undefined); // true

/* 차이점: user.name으로 확인하면  
           값이 undefined라 실제로 존재하는지 구분이 어렵지만, 
           in은 존재 여부만 확인
*/

3. 배열에서도 사용 가능

  • 배열의 인덱스(숫자도 문자열로 변환됨)를 확인할 수 있음
const arr = [10, 20, 30];

console.log(1 in arr); // true (arr[1]이 존재)
console.log(3 in arr); // false (arr[3] 없음)

hasOwnProperty()

  • 객체 자신이 가지고 있는 프로퍼티인지 확인할 때 사용하는 메서드
  • 반환값: true 또는 false
  • 범위 : 객체 자신만
  • 값이 undefined라도 존재하면 true.
// [문법]
객체이름.hasOwnProperty("키이름")
const obj = { name: "Alice" };

console.log(obj.hasOwnProperty("name")); // true
console.log(obj.hasOwnProperty("toString")); // false

hasOwnProperty() 특징

배열에서도 사용 가능

  • 배열도 객체이기 때문에 hasOwnProperty로 인덱스 존재 여부를 확인 가능
const arr = [10, 20];

console.log(arr.hasOwnProperty(0)); // true
console.log(arr.hasOwnProperty(2)); // false

사용 예

객체 자신만 반복하고 싶을 때 안전하게 사용

  • 객체 프로퍼티를 반복할 때 상속받은 키를 제외하고 싶을 때 사용
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key, obj[key]); // obj 자신의 키만 출력
  }
}

in vs hasOwnProperty 비교

구분 in hasOwnProperty
범위 객체 자체 + 상속 객체 자체만
존재 확인 true/false true/false
undefined 포함 포함 포함
const obj = { name: undefined };

console.log("name" in obj); // true
console.log(obj.hasOwnProperty("name")); // true

console.log("toString" in obj); // true
console.log(obj.hasOwnProperty("toString")); // false

객체에서의 for...in

  • 객체의 모든 열거 가능한(enumerable) 키를 반복할 때 사용하는 반복문
  • 열거 가능한(enumerable) :객체의 프로퍼티가 반복문(for...in)이나 Object.keys() 같은 메서드로 나열될 수 있는지 여부
  • for...in은 객체의 키를 반복하면서 값에 접근할 때 사용
  • 상속받은 프로퍼티도 포함될 수 있음
  • 배열에 사용할 수도 있지만, 인덱스 순서가 보장되지 않아 일반적으로 객체에서 쓰는 것이 맞음
  • 객체의 키를 반복해야 한다면 무조건 for...in 또는 Object.keys/values/entries를 사용
  • 배열 같은 인덱스 기반 반복과는 다르게 객체의 키 중심으로 동작
  • 즉, for...in = “객체 친화적인 반복문

const person = {
  name: "Alice",
  age: 25,
  job: "developer"
};

for (let key in person) {
  console.log(key);         // 키 출력: name, age, job
  console.log(person[key]); // 값 출력: Alice, 25, developer
}
// 상속 프로퍼티 제외하고 반복
const obj = { name: "Alice" };

for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key, obj[key]);
  }
}

다른 반복문과의 차이

반복문  객체에서 사용 가능? 특징
for 가능하지만 인덱스로 접근해야 함 숫자 인덱스 기반, 키를 바로 가져올 수 없음
for...of 객체는 직접 불가
(iterable 객체(반복 가능한 객체)를 반복할 때 사용되는 반복문)

Object.keys/values/entries(obj)를 사용해서
객체를 iterable로 만들어야 객체에서 사용 가능.
-배열, 문자열, Map, Set 가능
for...in 객체에 최적화 객체 키 반복 가능, 상속 프로퍼티도 포함

 

반응형