函数是Javascript中的对象还是类型?

函数是Javascript中的对象还是类型?,javascript,Javascript,在他雄辩的Javascript中,Haverbeke声称(第16页): 在JavaScript系统中,大多数数据被整齐地划分为值。每个值都有一种类型,它决定了它可以扮演的角色。值有六种基本类型:数字、字符串、布尔值、对象、函数和未定义的值 但是Javascript中的Crockford:好的部分是: JavaScript的简单类型是数字、字符串、布尔值(true和false)、null和未定义。所有其他值都是对象。数字、字符串和布尔值都是对象,因为它们有方法,但它们是不可变的。JavaScrip

在他雄辩的Javascript中,Haverbeke声称(第16页):

在JavaScript系统中,大多数数据被整齐地划分为值。每个值都有一种类型,它决定了它可以扮演的角色。值有六种基本类型:数字、字符串、布尔值、对象、函数和未定义的值

但是Javascript中的Crockford:好的部分是:

JavaScript的简单类型是数字、字符串、布尔值(true和false)、null和未定义。所有其他值都是对象。数字、字符串和布尔值都是对象,因为它们有方法,但它们是不可变的。JavaScript中的对象是可变键集合。在JavaScript中,数组是对象,函数是对象,正则表达式是对象,当然,对象也是对象。”

现在,至少在V8下,我得到了以下结果:

> typeof function(){};
'function'
> typeof {};
'object'

我不明白是对象是类型,函数是对象,还是函数和对象都是类型。我想我忽略了基本类型和其他类型(复合类型?)之间的区别

它们是一种对象

类型是
“函数”

内部
[[Class]]
[object Function]

({}).toString.call(function() {}) === "[object Function]" // true
它们是
函数
构造函数原型的一个实例:

(function(){}) instanceof Function // true
(function(){}) instanceof Object // true
它们是
对象
构造函数原型的实例:

(function(){}) instanceof Function // true
(function(){}) instanceof Object // true

JavaScript支持函数式编程。因此,所有JavaScript函数都是一级函数,这意味着函数被视为普通对象


在谈论javascript中的类型时需要小心。值具有一个值,该值可以是以下值之一:

  • 未定义
  • 空的
  • 布尔值
  • 反对
  • 相反,返回的值不是类型,它是一个字符串,与大多数值的类型相同,但与以下值不同:

  • Null返回“object”,即使其类型为Null
  • 实现
    [[Call]]
    的对象返回函数,即使其类型是object
  • 宿主对象可以返回除其中一个限制值之外的任意值

  • 所以底线是函数的类型是Object,但是
    typeofsomefn
    返回
    function

    JS中的所有东西都是Object。这就像说正方形是长方形,但长方形不是正方形。@Derek:不完全是正方形。JS有原语(非对象),其中一些有对象“包装器”,但不是全部。最简单的方法是将函数视为一种特殊类型的对象,就像数组是一种特殊类型的对象一样。它们具有对象的功能,但也具有使它们成为不同类型对象的其他功能。如果它们被完全像普通对象一样对待(例如,
    {}
    ),那么为什么
    typeof{}!==typeof function(){}
    ?@icktoofay,因为ECMA-262定义了返回的内容,而对于某些对象,它不返回类型(例如,Null是Null类型,但
    typeof Null
    返回“object”)。(我实际上是想让他们将其添加到答案中,这并不是我真正想知道的。)