반응형
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 | 객체에 최적화 | 객체 키 반복 가능, 상속 프로퍼티도 포함 |
반응형
'JS > Javascript' 카테고리의 다른 글
[javascript] 객체 7 / 객체 내장 메서드 (0) | 2025.09.02 |
---|---|
[javascript] 객체 6 / 객체와 참조 복사 (원시값, 값 복사, 참조 복사, 얕은 복사, 깊은 복사) (0) | 2025.09.02 |
[javascript] 객체 4 / 객체 삭제 (0) | 2025.08.21 |
[javascript] 객체 3 / 객체 수정, 객체 추가 (0) | 2025.08.21 |
[javascript] 객체 2 / 객체 접근 (0) | 2025.08.20 |