当您在浏览器或Node.js中运行以下代码时,您将获得评论中列出的预期结果:
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
但是,当您在PhantomJS中运行该代码时,两种情况下的输出都为[object DOMWindow]
。
这似乎很奇怪,因为undefined
和null
都是本机类型。 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
属性值,有没有办法改变它?我知道我可以使用不同的方法来确定类型,但我宁愿不必这样做。
答案 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)
。所以似乎能够合理地字符串化null
和undefined
是对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();
}