2013-01-08 2 views
10

는 브라우저에서 다음 코드를 실행하거나, Node.js를, 당신은 코멘트에 나와있는 예상 결과를 얻을 때 : 당신이 PhantomJS에서 해당 코드를 실행하면DOMWindow 유형이 null이고 정의되지 않은 이유는 무엇입니까?

Object.prototype.toString.call(undefined); // "[object Undefined]" 
Object.prototype.toString.call(null); // "[object Null]" 

은, 그러나, 출력에 [object DOMWindow]을입니다 두 경우 모두.

undefinednull이 모두 기본 유형이기 때문에 이상하게 보입니다. typeof 운영자는합니다 (typeof null === "object" 특질 포함) 다른 환경에서와 같이 작업 표시, 그래서 PhantomJS 적어도 정의되지 않은 유형의 개념이 않음을 나타납니다 : Object.prototype.toString가 기본 포함되어

typeof undefined; // "undefined" 

또한 주장을 코드. Phantom 자체가 구현을 수정하는 데 아무 것도하지 않는다는 것을 나타낼 수 있습니다. (그럴 지 모르겠지만 - 소스에서 유용한 것을 찾지 못했습니다.)

Object.prototype.toString.toString(); // "function toString() { [native code] }" 

왜 PhantomJS는 올바른을 사용하지 않거나 노출하지 않는 이유는 무엇입니까? nullundefined에 대한속성 값은 어떻게 변경합니까? 유형을 결정하기 위해 다른 방법을 사용할 수는 있지만 오히려 필요하지는 않습니다.

+6

버그와 비슷합니다. – SLaks

+0

@SLaks - 예, 처음 생각했는데 이상한 코드 나 드물게 발견 된 코드가 아닙니다 ... 나는 처음 만났을 때 가장 먼저 의심 스럽지만 이슈 트래커의 어디서나. –

+0

호기심에서 벗어나세요 : 어떤 종류의 문제를 해결하려고합니까? 또는이 문제의 영향을받는 조건은 무엇입니까? –

답변

7

두 가지가 결합 된 것입니다. 스크립트는 웹 페이지 내에서 실행과에서 알 수 있듯이, 따라서 글로벌 객체의 window 객체이다 : 또한

console.log(this.toString()); // [object DOMWindow] 

의 아래에있는 객체의 프로토 타입 체인을 왜곡하는 자바 스크립트 구현의 해당 버전에 문제가 있습니다 위의 조건.

이것은 향후 버전에서 수정 될 예정입니다.

+0

공식 답변을 주셔서 감사합니다 :) 나는 전역 개체가'창 '이고 그와 관련이 있다고 생각했지만 소스를 파헤 치며 팬텀과 JSC는 지루하고 어디서나 나를 데려 오지 못했습니다. –

+1

PhantomJS 또는 JSC에 문제가 있습니까? –

+0

좋은 버그는 모두 나이가 들수록 더 좋아집니다. 진행 상황을 업데이트 할 수 있습니까? – Olga

-1

2 가지 유형이라면 문제를 해결할 수있을 것 같습니다.

Object.prototype.toString = function(obj){ 

    if(typeof(obj) == "undefined"){ 
     return "[object Undefined]"; 
    } 

    if(typeof(obj) == "null"){ 
     return "[object Null]"; 
    } 

    return obj.toString(); 

} 
+2

나는 내 질문에 말했듯이, 내가 형식을 얻는 방식을 바꿀 수 있다는 것을 알고 있지만 오히려 그럴 필요가 없다. 게다가,'obj.toString()'호출 대신 네이티브 메소드를 잃어 버렸기 때문에 코드가 작동하지 않습니다. 또한'typeof'는 함수가 아닌 연산자이며, null에 대한 "object"를 반환한다는 점에 유의하십시오 (제 질문에서 언급 한 것). –

+0

답변을 정정하십시오'typeof null === 'object'' – Olga

0

나는 가지 여기에 도달하고있어 인정한다,하지만 MDN article on Object.toString()는 언급 :

자바 스크립트에서 1.8.5 [객체 널] 널 (null)을 반환 호출 toString() 및 정의되지 않은 반환을 시작 [객체를 ECMAScript 5 판 및 그 다음 에라타에 정의 된대로 정의되지 않음]. Using toString to detect object type을 참조하십시오.

연결된 섹션에는 사용중인 구조체 Object.prototype.toString(null)이 나와 있습니다. 따라서 nullundefined은 Javascript에 대한 새로운 (-ish) 추가/수정으로 PhantomJS 엔진 (Apple JavaScriptCore, 어떤 버전을 알고 있는지)이 아직 구현되지 않은 것 같습니다. 즉, 이것은 Safari 6에서 올바르게 작동하므로 ES5 준수 여부를 묻는 버그로보고하는 것이 좋습니다.

관련 문제