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

18
在他的《JavaScript编程精解》一书中,Haverbeke声称(第16页):“在JavaScript系统中,大多数数据都整齐地分为称为值的东西。每个值都有一个类型,确定它可以扮演的角色种类。有六种基本类型的值:数字、字符串、布尔值、对象、函数和未定义的值。”
但是,在《JavaScript权威指南》一书中,Crockford则说:“JavaScript的简单类型包括数字、字符串、布尔值(true和false)、null和undefined。所有其他值都是对象。数字、字符串和布尔值类似对象,因为它们有方法,但它们是不可变的。JavaScript中的对象是可变的键集合。在JavaScript中,数组是对象,函数是对象,正则表达式是对象,当然,对象也是对象。”
现在,至少在V8下我得到这个:
> typeof function(){};
'function'
> typeof {};
'object'

我不明白对象是一种类型,函数是一个对象,还是函数和对象都是类型。我猜我没有理解原始类型和其他类型(复合类型?)之间的区别。


JavaScript 中的所有东西都是对象。这就像说正方形是矩形,但矩形不一定是正方形。 - Derek 朕會功夫
2
@Derek:并不是所有的东西都可以。JS有原始类型(非对象),其中一些有对象“包装器”,但并非全部。 - the system
最好将函数视为一种特殊类型的对象,就像数组是一种特殊类型的对象一样。它们具有对象的功能,但也具有使它们成为不同类型对象的其他功能。 - jfriend00
3个回答

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

5
你在讨论JavaScript中的类型时需要小心。值具有类型,可能是以下之一:
  1. 未定义
  2. null
  3. 布尔值
  4. 字符串
  5. 数字
  6. 对象
令人困惑的是,typeof运算符返回的值不是类型,而是一个字符串,对于大多数值来说,它与类型相同,但对于以下情况则不同:
  1. null返回'object',尽管其类型为null
  2. 实现了[[Call]]的对象返回function,尽管其类型为Object
  3. 宿主对象可以返回除受限制的值之外的任何内容
因此,函数的类型是Object,但typeof someFn返回function

-1

2
如果它们被完全视为普通对象(例如,{}),那么为什么 typeof {} !== typeof function() {} - icktoofay
1
@icktoofay——因为ECMA-262定义了typeof运算符返回的内容,对于某些对象,它并不返回类型(例如,Null是Null类型,但typeof Null返回'object')。 - RobG
1
我实际上是在试图让他们把那个加入到答案中 - 这不是我真正想知道的事情。 - icktoofay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接