code

for..in 및 hasOwnProperty

codestyles 2020. 12. 1. 08:02
반응형

for..in 및 hasOwnProperty


중복 가능성 :
객체에 Javascript 속성이 있는지 확인하려면 어떻게합니까?

Twitter의 JS 파일에서 다음 스 니펫을 발견했습니다. 나는 왜 그들이 전화를해야합니까 궁금해서 hasOwnProperty보고 기능 dictkey속성을? 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';

, 속성 이있는 객체 dictfoo있고 프로토 타입 체인에서 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

반응형