在他的 Eloquent Javascript 中,Haverbeke声称(第16页):
“在JavaScript系统中,大多数数据被巧妙地分成称为值的东西。每个值都有一个类型,它决定了它可以扮演的角色类型。有六种基本类型的值:数字,字符串,布尔值,对象,函数和未定义的值。“
但 Javascript:The Good Parts 中的Crockford说:
“简单类型的JavaScript是数字,字符串,布尔值(真和假),空和未定义。所有其他值都是对象。数字,字符串和布尔值是对象的,因为它们有方法但它们是不可变的.JavaScript中的对象是可变的键控集合。在JavaScript中,数组是对象,函数是对象,正则表达式是对象,当然,对象是对象。“
现在,至少在V8下我得到了这个:
> typeof function(){};
'function'
> typeof {};
'object'
我不明白对象是一个类型,函数是一个对象,还是函数和对象都是类型。我想我错过了原始类型和其他类型(复合类型?)之间的区别。
答案 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,可能是以下之一:
反过来说,typeof
operator返回的值不是Type,它是一个字符串,与大多数值的Type相同,但不同之处在于:
[[Call]]
的对象返回函数,即使其Type为Object 所以底线是函数的类型是Object,但typeof someFn
返回function
。
答案 2 :(得分:0)
JavaScript支持函数式编程。因此,所有JavaScript函数都是第一类函数,这意味着函数被视为普通对象。