javascript - javascript函数什么时候不是对象?

标签 javascript google-chrome

我在 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/

相关文章:

javascript - 如何创建一个在单击时增加计数器的按钮?

javascript - 如何创建一个 d3 线函数来为 x、y1、y2 数据绘制 2 条线?

javascript - 访问 ReactJS 中另一个组件的状态?

firefox - Chrome/Firefox 上的盒子模型尺寸

JavaScript chrome 控制台错误

HTML - 属性自动完成 ="on"在 Chrome 浏览器中不起作用

css - Chrome shadow-root 应用奇怪的 CSS 规则

javascript - 如何统计数组中每一项出现的次数?

javascript - 如何将 li 文本添加到悬停 jQuery 上的元素

javascript - 不间断ajax请求