我在 javascript 调试 session 中看到以下行为:
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 上]
请注意,这是在一个非常复杂的调试 session 中。我不完全知道“o”是从哪里来的,或者它是如何创建的。此外,到目前为止,我还无法通过简单的测试用例重现此问题。一个简单的设置按预期工作:
var t = function() { return true; } //undefined
t.a = "aa" //"aa"
Object.keys(t) //["a"]
最佳答案
当你看到这样的东西时,你可能会尝试:
console.log(Object.keys)
或等效的。
(如果你能找到你浏览器的键的原始实现,比较并确保它与你所看到的相同)
(如果看到此类问题,请阅读对问题的评论以获得更多要查看的想法)
误报。函数始终是对象,Chrome 的人知道如何制作虚拟机。
我跑了
grep -r "Object.defineProperty(" *
grep -r "Object.defineProperties(" *
并找到了一个 Object.keys 被覆盖的地方,有一个错误的函数。
相关代码是动态加载的,所以我没有看到它在浏览器中显式加载。
关于javascript - javascript函数什么时候不是对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18857500/