for..in 및 hasOwnProperty
중복 가능성 :
객체에 Javascript 속성이 있는지 확인하려면 어떻게합니까?
Twitter의 JS 파일에서 다음 스 니펫을 발견했습니다. 나는 왜 그들이 전화를해야합니까 궁금해서 hasOwnProperty
보고 기능 dict
이 key
속성을? for 루프가 'dict'의 각 '키'에 대해 실행되고 있는데 이는 'dict'에 'key'가 있음을 의미합니다.
function forEach(dict, f) {
for (key in dict) {
if (dict.hasOwnProperty(key))
f(key, dict[key]);
}
}
그렇지 않은 경우, 알지 못하는 속성을 포함하여 프로토 타입 체인의 모든 속성을 반복합니다 (네이티브 객체 프로토 타입을 엉망으로 만든 누군가에 의해 추가되었을 수 있음).
이렇게하면 해당 개체 인스턴스 자체에있는 키만 보장됩니다.
hasOwnProperty의 메서드는 속성이 개체의 인스턴스에 직접 또는 그것의 프로토 타입 체인에서 상속 여부를 알 수 있습니다.
다음을 고려하세요
function ObjWithProto() {
this.foo = 'foo_val';
}
ObjWithProto.prototype = {bar: 'bar_val'};
var dict = new ObjWithProto();
dict.foobar = 'foobar_val';
즉 , 속성 이있는 객체 dict
가 foo
있고 프로토 타입 체인에서 foobar
속성 bar
을 상속합니다 .
이제 코드 (수정 된 버전)를 통해 실행하십시오.
function forEach(dict) {
var key;
for (key in dict) {
if ( dict.hasOwnProperty(key) ) console.log('has', key, dict[key]);
else console.log('not', key, dict[key]);
}
}
forEach( dict );
당신은 볼 것이다
has foo foo_val
has foobar foobar_val
not bar bar_val
이를 통해 객체 자체와 상속 된 속성 (일반적으로 루프와 관련이없는 메서드)을 분리 할 수 있습니다.
또한 지금 dict.bar = 'new_bar_val';
하면 마지막 결과가로 변경되어 has bar new_bar_val
상속 된 속성과 이름이 같은 속성을 구별 할 수 있습니다.
자바 스크립트의 모든 객체는 사전입니다. 이것은 "toString"과 다른 모든 메소드가 모든 객체의 키임을 의미합니다.
var myObj = {};
console.log(myObj["toString"]);
그러나이 함수는 Object 클래스에서 상속되므로 hasOwnProperty는이 키가 사전에 소유되었는지 아니면 상속되었는지 여부를 알려줍니다.
"toString" in myObj; // true
myObj.hasOwnProperty("toString") // false
@blockhead는 바로 여기입니다. 예를 들어, Prototype.js 프레임 워크는 추가 도우미 메서드를 사용하여 네이티브 배열을 확장하는 데 사용되었습니다 (현재 버전의 프레임 워크에서는 상황을 모릅니다). 따라서 "for (key in dict)"를 직접 사용하면 div의 모든 요소와 도우미 메서드에 대한 참조가 반환됩니다. 예상치 못한 것입니다 :)
참고 URL : https://stackoverflow.com/questions/12735778/for-in-and-hasownproperty
'code' 카테고리의 다른 글
삼성 갤럭시 탭 에뮬레이트 (0) | 2020.12.01 |
---|---|
Qt의 기본 사용자 브라우저에서 링크를 여는 방법은 무엇입니까? (0) | 2020.12.01 |
JavaScript setInterval () 메서드로 인해 메모리 누수가 발생합니까? (0) | 2020.12.01 |
"대기 가능한"메서드를 작성하는 방법은 무엇입니까? (0) | 2020.12.01 |
Pandas DataFrame 성능 (0) | 2020.12.01 |