我正在使用
var foo = function(){}
typeof(foo)
- 返回函数而不是Object
虽然javascript概念告诉javascript中的所有函数都是对象?
答案 0 :(得分:6)
首先,事实上规范在很多地方明确说明了他们的对象,包括here,它定义了术语"功能&#34 ;:
<强>功能强>
可以作为子例程调用的Object类型的成员
根据经验,有很多方法可以证明它,但最简单的方法之一是为其上的属性赋值:
var foo = function() { };
foo.myProperty = "my value";
console.log(foo.myProperty); // "my value"
&#13;
或者使用一个作为原型(这是不寻常的,但可能),这证明它只是对象可以是原型:
var foo = function() { };
var obj = Object.create(foo);
console.log(Object.getPrototypeOf(obj) === foo); // true
&#13;
答案 1 :(得分:1)
测试怎么样
'static
对整数执行相同操作将导致未定义的赋值
> x = function(){}
<- function (){}
> x.a = "Asd"
<- "Asd"
> x
<- function (){}
> x.a
<- "Asd"
答案 2 :(得分:1)
查看我的list of proper ways to test if a value belongs to the Object type。
他们将函数检测为对象,例如
var func = function(){};
Object(func) === func; // true --> func is an object
如果您需要更正式的证明,则需要查看规范,例如ECMAScript Overview
函数是可调用对象
答案 3 :(得分:1)
你可以非常简单地证明这一点:
console.log(Object.getPrototypeOf(Function.prototype));
console.log(Object.prototype === Object.getPrototypeOf(Function.prototype));
// or, being evil
Object.prototype.testFn = () => console.log('Exists on all objects');
({}).testFn();
[].testFn();
(new Number(5)).testFn();
Math.sqrt.testFn();
前两行表明原型链中Function.prototype
之后的下一步是Object.prototype
。
其他行显示您可以向Object.prototype
添加属性(严重不要执行此操作)并且它存在于所有对象上。在这种情况下,我们在空对象,空数组,Number
对象和Math.sqrt
函数上测试它。通过向Object.prototype
添加属性(在这种情况下为函数),所有其他属性也获得了属性。
答案 4 :(得分:0)
console.log(Function.prototype instanceof Object);