函数是Javascript中的对象还是类型?
在他雄辩的Javascript中,Haverbeke声称(第16页): 在JavaScript系统中,大多数数据被整齐地划分为值。每个值都有一种类型,它决定了它可以扮演的角色。值有六种基本类型:数字、字符串、布尔值、对象、函数和未定义的值 但是Javascript中的Crockford:好的部分是: JavaScript的简单类型是数字、字符串、布尔值(true和false)、null和未定义。所有其他值都是对象。数字、字符串和布尔值都是对象,因为它们有方法,但它们是不可变的。JavaScript中的对象是可变键集合。在JavaScript中,数组是对象,函数是对象,正则表达式是对象,当然,对象也是对象。” 现在,至少在V8下,我得到了以下结果:函数是Javascript中的对象还是类型?,javascript,Javascript,在他雄辩的Javascript中,Haverbeke声称(第16页): 在JavaScript系统中,大多数数据被整齐地划分为值。每个值都有一种类型,它决定了它可以扮演的角色。值有六种基本类型:数字、字符串、布尔值、对象、函数和未定义的值 但是Javascript中的Crockford:好的部分是: JavaScript的简单类型是数字、字符串、布尔值(true和false)、null和未定义。所有其他值都是对象。数字、字符串和布尔值都是对象,因为它们有方法,但它们是不可变的。JavaScrip
> 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”)。(我实际上是想让他们将其添加到答案中,这并不是我真正想知道的。)