我在javascript调试会话中看到以下行为:
o // function (a1, a2, a3) { return a1 + a2 + a3; }
typeof(o) //'function'
for (var n in o) { console.log(n); } //<a list of properties>
Object.keys(o) //TypeError: not an object
Object.prototype.toString.call(o); //"[object Function]"
让我想知道 - 一个功能,永远不是对象吗?
[在Chrome 29上运行,在Mac上运行]
请注意,这是一个非常复杂的调试会话。我不确切知道“o”的来源,或者它是如何创建的。此外,我到目前为止还没有用简单的测试用例重现这个问题。一个简单的设置按预期工作:
var t = function() { return true; } //undefined
t.a = "aa" //"aa"
Object.keys(t) //["a"]
答案 0 :(得分:4)
当您看到类似的内容时,您可以尝试:
console.log(Object.keys)
或同等的。
(如果您能找到适合您浏览器的密钥的原始实现,请进行比较并确保它与您所看到的相同)
(如果看到这类问题,请阅读有关问题的评论,以了解更多关于事物的想法)
误报。功能始终是对象,Chrome上的人员知道如何制作虚拟机。
我跑了
grep -r "Object.defineProperty(" *
grep -r "Object.defineProperties(" *
并找到了一个覆盖Object.keys的地方,并且有一个错误的功能。
相关代码是动态加载的,所以我没有看到它显式加载到浏览器中。
答案 1 :(得分:2)
Object.keys
algorithm执行的第一步是:
- 如果Type( O )不是Object,则抛出 TypeError 异常。
醇>
由于您收到此类错误,我认为您的对象必须是主机对象,如上面的Bergi commented。尽管如此,Object.prototype.toString.call(o)
给出“[对象功能]”是奇怪的,因为host objects are not allowed to use "Function" as their [[Class]]
property value。
*有关Type(x)
的含义,请参阅规范的Section 8中的最后一句话。