18

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

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

但是 Javascript 中的 Crockford : The Good Parts说:

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

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

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

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

4

3 回答 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
于 2013-03-14T02:10:34.923 回答
5

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

  1. 不明确的
  2. 无效的
  3. 布尔值
  4. 细绳
  5. 数字
  6. 目的

typeof相反,运算符返回的值不是类型,它是一个字符串,与大多数值的类型相同,但在以下情况下不同:

  1. Null 返回“对象”,即使其类型为 Null
  2. 实现[[Call]]返回函数的对象,即使它的 Type 是 Object
  3. 宿主对象可以返回他们喜欢的任何东西,而不是受限值之一

所以底线是函数的类型是对象,但typeof someFn返回function

于 2013-03-14T02:46:12.987 回答
-1

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

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

于 2013-03-14T02:16:13.547 回答