为什么null和未定义DOMWindow类型?

时间:2013-01-08 15:42:30

标签: javascript phantomjs

当您在浏览器或Node.js中运行以下代码时,您将获得评论中列出的预期结果:

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

但是,当您在PhantomJS中运行该代码时,两种情况下的输出都为[object DOMWindow]

这似乎很奇怪,因为undefinednull都是本机类型。 typeof运算符似乎与其他环境(包括typeof null === "object" quirk)一样工作,因此看起来PhantomJS至少具有未定义类型的概念:

typeof undefined; // "undefined"

它还声称Object.prototype.toString包含本机代码,这可能表明Phantom本身没有做任何修改实现的事情(我不知道是否是这种情况 - 我还没有能够在源中找到任何有用的东西):

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

那么为什么PhantomJS不使用(或至少公开)[[Class]]null的正确undefined属性值,有没有办法改变它?我知道我可以使用不同的方法来确定类型,但我宁愿不必这样做。

3 个答案:

答案 0 :(得分:7)

这是两件事的组合。脚本在网页中执行,因此全局对象是window对象,如下所示:

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

此外,在上述条件下伪造对象原型链的JavaScript实现版本存在问题。

这可能会在将来的某个版本中修复。

答案 1 :(得分:0)

我承认我有点到达这里,但MDN article on Object.toString()提及:

  

从JavaScript 1.8.5开始toString()调用null返回[object Null],undefined返回[object Undefined],如第5版ECMAScript和随后的勘误表中所定义。请参阅Using toString to detect object type

链接部分会描述您正在使用的构造Object.prototype.toString(null)。所以似乎能够合理地字符串化nullundefined是对Javascript的一个新的( - )添加/更正,PhantomJS引擎(Apple的JavaScriptCore,谁知道哪个版本)没有实现然而。也就是说,这在Safari 6中可以正常工作,因此可能值得将此报告为错误,要求符合ES5标准。

答案 2 :(得分:-1)

如果它只是2种类型,我想你可以用这个来解决你的问题。

Object.prototype.toString = function(obj){

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

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

    return obj.toString();

}