JavaScript에서 in
연산자는 개체에 지정된 속성이 있는지 확인합니다. 그러나 객체의 자체 속성뿐만 아니라 프로토 타입 체인도 검사하지 않습니다. 따라서 어떤 경우에는 예상대로 작동하지 않을 수 있습니다. 그 객체가 in
연산자를 사용하여 키와 같은 특정 방법이있는 경우hasOwnProperty() 대신 in 연산자를 사용해야하는 경우가 있습니까?
const someArrayMethods = {
indexOf: true,
map: true,
};
우리는 확인할 수 있습니다
의 우리가 객체 someArrayMethods
(분명히)를 포함하는 키와 같은 일부 배열 방법이 어떤 이유로 그런 말을 보자 :
console.log('indexOf' in someArrayMethods); // true
console.log('every' in someArrayMethods); // false
toString
속성을 확인하려고하면 어떻게됩니까?
console.log('toString' in someArrayMethods); // true
서프라이즈! 이 개체는 프로토 타입 체인에 toString
method이 있으므로 개체에 자체 toString
속성이 없더라도 in
연산자는 true
을 반환합니다.
그리고 여기서 hasOwnProperty()
이 구해줍니다! 한 가지 차이점을 제외하면 in
연산자와 거의 같습니다. 프로토 타입 체인을 검사하지 않습니다. 이전 예제를 다시 작성할 수 있습니다.
console.log(someArrayMethods.hasOwnProperty('toString')); // false
이제 예상대로 작동합니다. 불행하게도 hasOwnProperty()
도 하나의 경우에 실패 할 수 있습니다. 우리 자신의 재산이있는 물건을 가지고 있다면 hasOwnProperty
? 이 예제 참조 :
const someObject = {
hasOwnProperty() {
return false;
},
theAnswer: 42,
};
// Does `someObject` has own property `theAnswer`?
console.log(someObject.hasOwnProperty('theAnswer')); // false
// Well, it seems it doesn't...
대신 someObject.hasOwnProperty
를 사용,이 문제를 해결하기를, 우리는 Object.prototype
에서 직접 그 방법을 참조 할 수 있습니다 :
const hasOwn = Object.prototype.hasOwnProperty;
console.log(hasOwn.call(someObject, 'theAnswer')); // true
이는 경우 확인을위한 가장 합리적인 접근 방식을 것 같다 객체에는 몇 가지 속성이 있습니다. 그럼에도 불구하고 in
연산자가 유용 할 수있는 경우가 있습니까? 어떤 클래스의 인스턴스에 어떤 메소드가 있는지 확인하는 데 사용할 수는 있지만이 경우 해당 오브젝트가 해당 클래스의 인스턴스인지 단순히 확인하는 것이 더 좋지 않습니까? 보조 노트로
또 다른 옵션은 ECMAScript를 2016 Array.prototype.includes()
와 Object.keys()
을 사용하는 것입니다
console.log(Object.keys(someObject).includes('theAnswer')); // true