10

当您在浏览器或 Node.js 中运行以下代码时,您会得到注释中列出的预期结果:

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

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

这看起来很奇怪,因为undefinednull都是原生类型。该typeof操作符似乎像在其他环境中一样工作(包括typeof null === "object"怪癖),因此看起来 PhantomJS 至少具有未定义类型的概念:

typeof undefined; // "undefined"

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

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

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

4

3 回答 3

7

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

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

此外,该版本的 JavaScript 实现存在一个问题,它在上述情况下伪造了对象原型链。

这可能会在未来的某个版本中得到修复。

于 2013-01-10T02:16:26.037 回答
0

我承认我有点到达这里,但MDN 文章Object.toString()提到:

从 JavaScript 1.8.5 开始,在 null 上调用的 toString() 返回 [object Null],undefined 返回 [object Undefined],如 ECMAScript 第 5 版和后续勘误表中所定义。请参阅使用 toString 检测对象类型

然后,链接部分描述了Object.prototype.toString(null)您正在使用的构造。因此,它似乎能够明智地进行字符串化null,并且undefined是 PhantomJS 引擎(Apple 的 JavaScriptCore,谁知道哪个版本)尚未实现的对 Javascript 的新(-ish)添加/更正。也就是说,这在 Safari 6 中可以正常工作,因此可能值得将其报告为错误,要求符合 ES5。

于 2013-01-10T02:33:46.547 回答
-1

如果只是这两种类型,我认为你可以用这个来解决你的问题。

Object.prototype.toString = function(obj){

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

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

    return obj.toString();

}
于 2013-01-09T02:56:38.383 回答