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

时间:2013-09-17 18:42:38

标签: javascript google-chrome

我在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"]

2 个答案:

答案 0 :(得分:4)

当您看到类似的内容时,您可以尝试:

console.log(Object.keys)

或同等的。

(如果您能找到适合您浏览器的密钥的原始实现,请进行比较并确保它与您所看到的相同)

(如果看到这类问题,请阅读有关问题的评论,以了解更多关于事物的想法)


误报。功能始终是对象,Chrome上的人员知道如何制作虚拟机。

我跑了

grep -r "Object.defineProperty(" *

grep -r "Object.defineProperties(" *

并找到了一个覆盖Object.keys的地方,并且有一个错误的功能。

相关代码是动态加载的,所以我没有看到它显式加载到浏览器中。

答案 1 :(得分:2)

Object.keys algorithm执行的第一步是:

  
      
  1. 如果Type( O )不是Object,则抛出 TypeError 异常。
  2.   

由于您收到此类错误,我认为您的对象必须是主机对象,如上面的Bergi commented。尽管如此,Object.prototype.toString.call(o)给出“[对象功能]”是奇怪的,因为host objects are not allowed to use "Function" as their [[Class]] property value

*有关Type(x)的含义,请参阅规范的Section 8中的最后一句话。