if (객체 입력) 또는 if (object.hasOwnProperty (key)
다음 두 문장이 같은 결과를 낳습니까? 다른 방법을 선호하는 이유가 있습니까?
if (key in object)
if (object.hasOwnProperty(key))
조심하십시오-동일한 결과를 얻지 못합니다.
in
또한 프로토 타입 체인 어딘가에 true
있으면 이름 을 반환 하지만 (이름이 이미 알려 주듯이) 해당 개체에서 직접 사용할 수있는 경우 에만 (속성 "소유") 반환 합니다 .key
Object.hasOwnProperty
true
key
다른 예를 설명하려고합니다. 두 가지 속성을 가진 다음 객체가 있다고 가정 해보십시오.
function TestObj(){
this.name = 'Dragon';
}
TestObj.prototype.gender = 'male';
TestObj의 인스턴스를 만들어 봅시다 :
var o = new TestObj();
객체 인스턴스를 살펴 보자.
console.log(o.hasOwnProperty('name')); // true
console.log('name' in o); // true
console.log(o.hasOwnProperty('gender')); // false
console.log('gender' in o); // true
결론:
in 연산자는 객체가 직접 또는 프로토 타입에서 속성에 액세스 할 수있는 경우 항상 true를 반환합니다.
hasOwnProperty ()는 속성이 인스턴스에 있지만 프로토 타입에는없는 경우에만 true를 반환합니다.
프로토 타입에 일부 속성이 논리적으로 존재하는지 확인하려면 다음과 같이 말합니다.
console.log(('name' in o) && !o.hasOwnProperty('name')); //false
console.log(('gender' in o) && !o.hasOwnProperty('gender')); //true - it's in prototype
드디어:
따라서이 두 가지 조건은 ...
if (key in object)
if (object.hasOwnProperty(key))
... 동일한 결과를 만들어 내면 대답은 분명합니다.
in
상속되지 않은 속성도 확인합니다 hasOwnProperty
.
요약 hasOwnProperty()
하면 프로토 타입을 보지 않고 프로토 타입을 in
보지 않습니다.
O'Reilly 고성능 자바 스크립트 에서 발췌 :
hasOwnProperty () 메소드를 사용하고 멤버 이름을 전달하여 오브젝트에 지정된 이름의 인스턴스 멤버가 있는지 여부를 판별 할 수 있습니다. 객체가 주어진 이름으로 속성에 액세스 할 수 있는지 확인하려면 in 연산자를 사용할 수 있습니다. 예를 들면 다음과 같습니다.
var book = {
title: "High Performance JavaScript",
publisher: "Yahoo! Press"
};
alert(book.hasOwnProperty("title")); //true
alert(book.hasOwnProperty("toString")); //false
alert("title" in book); //true
alert("toString" in book); //true
이 코드에서 hasOwnProperty ()는 title이 객체 인스턴스이므로 "title"이 전달되면 true를 반환합니다. "toString"이 인스턴스에 없기 때문에 전달되면 메소드는 false를 리턴합니다. 각 속성 이름을 in 연산자와 함께 사용하면 인스턴스와 프로토 타입을 검색하기 때문에 결과가 모두 참입니다.
정말 좋은 답변이 있습니다. 객체를 반복하면서 "hasOwnProperty"를 확인할 필요가없는 무언가를 제공하고 싶습니다.
객체를 만들 때 일반적으로 사람들은 다음과 같은 방식으로 객체를 만듭니다.
const someMap = {}
// equivalent to: Object.create(Object.prototype)
// someMap.constructor will yield -> function Object() { [native code] }
Now, if you want to iterate through "someMap" you will have to do it this way:
const key
for(key in someMap ){
if (someMap.hasOwnProperty(key)) {
// Do something
}
}
We are doing so in order to avoid iterating over inherited properties.
If you intend to create a simple object that will only be used as a "map" (i.e. key - value pairs) you can do so like that:
const newMap = Object.create(null);
// Now, newMap won't have prototype at all.
// newMap.constructor will yield -> undefined
So now it will be safe to iterate like this:
for(key in cleanMap){
console.log(key + " -> " + newMap [key]);
// No need to add extra checks, as the object will always be clean
}
I learned this awesome tip here
The other form (called for in) enumerates the property names (or keys) of an object. On each iteration, another property name string from the object is assigned to the variable. It is usually necessary to test object.hasOwnProperty(variable) to determine whether the property name is truly a member of the object or was found instead on the prototype chain.
for (myvar in obj) {
if (obj.hasOwnProperty(myvar)) { ... } }
(from Crockford's Javascript: The Good Parts)
The first version is shorter (especially in minified code where the variables are renamed)
a in b
vs
b.hasOwnProperty(a)
Anyway, as @AndreMeinhold said, they do not always produce the same result.
참고URL : https://stackoverflow.com/questions/13632999/if-key-in-object-or-ifobject-hasownpropertykey
'programing tip' 카테고리의 다른 글
_.each (list, iterator, [context])의 컨텍스트는 무엇입니까? (0) | 2020.06.02 |
---|---|
차단 대기열 만들기 (0) | 2020.06.02 |
HTML 텍스트 상자에서 키보드 캐럿 위치 설정 (0) | 2020.06.02 |
테이블에 열을 아직 추가하지 않은 경우 추가 (0) | 2020.06.02 |
함수에서 docstring 가져 오기 (0) | 2020.06.02 |