2011-07-29 4 views
14

"in"연산자와 "hasOwnProperty"메서드는 서로 바꿔 사용할 수있는 것처럼 보입니다. 그러나 상속 된 속성이나 무언가를 확인하고 다른 것이 아닌지 궁금합니다. 나는 특히 Dictionary와 함께 사용하는 경우에 관심이 있지만 다른 용도와 다른 점은 의심 스럽다.Actionscript 3에서 "in"연산자와 "hasOwnProperty"메서드의 차이점은 무엇입니까?

"hasOwnProperty"는 공식 문서 here에 설명되어 있으며 "in"은 here으로 표시되어 있지만 차이가있을 경우 매우 명확하지 않습니다.

답변

14

귀중하게 받아 들여진 대답을 신뢰하는 것은 실제로 저를 조금 문제로 만들었습니다. 프로토 타입 관련 차이점 이상으로 진행되는 것으로 보입니다. 내가 찾은 것은

hasOwnProperty는 해당 키가 참조 유형이지만 in 연산자는 사전에 키가 있는지 확인할 수 없습니다.

다음은 예제입니다.

코드 :

var test:Function = function(key:*,label:String):void 
    { 
     var d:Dictionary = new Dictionary(true); 
     d[key] = true; 
     trace(label); 
     trace(" hasOwnProperty: " + (d.hasOwnProperty(key)?"true":"false <== !!PROBLEM!!")); 
     trace(" in: " + (key in d)); 
     trace(" []: " + d[key]); 
    }; 
test({}, "indexed by object"); 
test("string", "key is string"); 
test(0, "key is number"); 
test(true, "key is boolean"); 

결과 :

indexed by object 
    hasOwnProperty: false <== !!PROBLEM!! 
    in: true 
    []: true 
key is string 
    hasOwnProperty: true 
    in: true 
    []: true 
key is number 
    hasOwnProperty: true 
    in: true 
    []: true 
key is boolean 
    hasOwnProperty: true 
    in: true 
    []: true 
+2

그리고 아직도 그것에 더있어. hasOwnProperty는 정적 검색을 지원하지 않습니다. 예를 들어,'** 정적 속성 **'- 객체의 정의 클래스 나 그 수퍼 클래스의 static 키워드로 정의 된 변수, 상수 또는 메소드; '** Prototype properties **'- 객체의 프로토 타입 체인의 일부인 프로토 타입 객체에 정의 된 속성. '거짓 '을 반환합니다. –

+0

정적 또는 프로토 타입 속성 또는 메서드가 있는지 확인하지 않기 때문에 'hasOwnProperty'가 아닌 속성이나 메서드에 액세스하면 오류가 발생하는지'in'을 보면 알 수 있습니다. –

4

hasOwnProperty은 아니지만 대부분의 AS3 개발자는 프로토 타입을 사용하지 않으므로 in은 프로토 타입 체인을 찾습니다. 따라서 일상적인 사용과 관련된 것은 아닙니다.

관련 문제