2012-10-04 5 views
1

자바 스크립트 코드에서 o.propertyIsEnumerable(x) 메서드를 발견했습니다. 나는 이것을 x in o 구조의 동의어로 이해합니다. 차이점이 있습니까? 그렇다면 첫 번째 구문을 사용할시기와 몇 번째 실용적인 예에서 두 번째 구문을 사용하는 시점을 보여줄 수 있습니까?propertyIsEnumerable (x) 대 x

var o = {}; 
o.x = 1; 
o.y = 2; 

if ("x" in o) { 
// some code 
} 

if (o.propertyIsEnumerable(x)) { 
    // some code 
} 

답변

3

이와 같은 문제를 해결하는 가장 쉬운 방법은 사양의 알고리즘을 따르는 것입니다.

  • 하자 내림차순가 O이 인수로 P을 전달하는 [[GetOwnProperty] 내부 메서드 호출의 결과 : 이것은 약 propertyIsEnumerable 우리에게 알려줍니다 것입니다.

  • desc가 정의되지 않은 경우 false를 반환합니다.

  • desc [[Enumerable]] 값을 반환하십시오. 당신이 볼 수 있듯이

, 그것은 문제의 객체의 [[GetOwnProperty]] internal method를 호출합니다. 이는 단순히 객체 자체의 (프로토 타입 체인의 항목이 아닌)에서 지정된 속성의 값을 반환합니다.

반환 인수 ToString (LVAL)와 rval에의 [[HasProperty] 내부 메서드를 호출 한 결과 :

지금의이 in operator에서 살펴보기로하자.

그리고 당신이 [[HasProperty]] internal method 보면 :

하자 내림차순 속성 이름 P와 O의 [[GetProperty를]] 내부 메서드 호출의 결과

그리고 차이점을 알 수 있습니다. in 연산자를 사용하면 [[GetOwnProperty]] 메서드 대신 [[[GetProperty]] 내부 메서드] [4]가 사용되므로 프로토 타입 체인 아래의 개체에 대한 속성을 찾을 수 있습니다.

다른 중요한 차이점은 객체에 열거되지 않는 속성을 정의 할 수 있다는 것입니다 (메서드 사용). 열거 가능하지 않은 속성을 정의하면 in 연산자로을 반환하지만 분명히 propertyIsEnumerable 메서드는 반환하지 않습니다. 다음은 fiddle that demonstrates the difference입니다.

0

이것은 프로토 타입 속성을 고려하고 열거 가능성을 고려하지 않습니다.

if (x in o) 

다른 하나는 그렇지 않습니다. 그것은 단지 "자신의"속성을 봅니다.

if (o.propertyIsEnumerable(x)) 
관련 문제