Javascript中的函数对象或类型?

时间:2013-03-14 02:08:56

标签: javascript

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

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

Javascript:The Good Parts 中的Crockford说:

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

现在,至少在V8下我得到了这个:

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

我不明白对象是一个类型,函数是一个对象,还是函数和对象都是类型。我想我错过了原始类型和其他类型(复合类型?)之间的区别。

3 个答案:

答案 0 :(得分:24)

他们是一种对象。

typeof"function"

typeof (function() {}) === "function" // true

内部[[Class]][object Function]

({}).toString.call(function() {}) === "[object Function]" // true

它们是Function构造函数原型的一个实例:

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

它们是Object构造函数原型的一个实例:

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

答案 1 :(得分:5)

在javascript中讨论类型时需要小心。值为Type,可能是以下之一:

  1. 未定义
  2. 布尔
  3. 字符串
  4. 对象
  5. 反过来说,typeof operator返回的值不是Type,它是一个字符串,与大多数值的Type相同,但不同之处在于:

    1. Null返回' object',即使其Type为Null
    2. 实现[[Call]]的对象返回函数,即使其Type为Object
    3. 主机对象可以返回除限制值之外的任何其他内容
    4. 所以底线是函数的类型是Object,但typeof someFn返回function

答案 2 :(得分:0)

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

http://en.wikipedia.org/wiki/First-class_functions