什么是函数';s数据类型:函数还是对象?在JavaScript中
MDN说: 六种基本数据类型:什么是函数';s数据类型:函数还是对象?在JavaScript中,javascript,types,Javascript,Types,MDN说: 六种基本数据类型: 布尔值 空的 未定义 数 串 符号(ECMAScript 6中新增) 和对象 但我混淆了函数数据类型和对象数据类型 让我们看看: var func = function() { console.log ('Hello World ! ') }; var obj = { property : something } console.log(typeof(func)); // ===> function console.log(
- 布尔值
- 空的
- 未定义
- 数
- 串
- 符号(ECMAScript 6中新增)
- 和对象
var func = function() {
console.log ('Hello World ! ')
};
var obj = {
property : something
}
console.log(typeof(func)); // ===> function
console.log(typeof(obj)); // ===> object
功能数据类型和对象数据类型是否不同?为什么typeof(func)
是函数?不是物体吗?文档中说有7种数据类型(6种原语,1种对象)。函数不包括在任何地方
到目前为止,一年多以来,我认为函数的数据类型是object,我听说函数是JavaScript中的第一类对象,所以我对函数是object没有疑问,但今天我想了更多的时间,并且想知道
它不同吗?从逻辑上讲,您可以将
函数
看作对象
的一个子类。它有对象的所有方法
以及一些特定于函数的方法(例如.bind()
,.call()
,.apply()
,等等)
为什么Javascript决定让函数
报告它自己独特的类型,而不是数组
(这是类似于对象
的派生)是任何人的猜测,可能只有语言的原始设计者知道。非常有用的是,Function
确实报告了它自己的类型,这样您就可以轻松地检查属性是否可以作为函数调用,这可能是这样做的主要原因
下面演示了函数
对象如何使用对象
的方法:
函数f(){}
f、 someProperty=“foo”;
日志(f.hasOwnProperty(“someProperty”);
日志(对象的f实例);
log(f instanceof函数);
函数日志(x){
var div=document.createElement(“div”);
div.innerHTML=x;
文件.正文.附件(div);
}
typeof
返回传递给它的内容的类型。函数是一个对象((function(){})instanceof object===true
),但是typeof
函数被定义为在对象在ECMA-262中实现[[Call]]时返回“function”
函数是对象,但
typeof
将其视为特例。它返回函数,但其函数对象typeof
不返回数据类型。typeof
不报告值的真实数据类型。它是一个查找表,将数据类型和其他值特征映射到名称:。函数是具有内部[[Call]]
属性的对象。这就是为什么typeofnull
是的“object”
(*grumpy face*)“当一个带有调用
方法的对象被提供给它时”-我不同意typeof{call:function(){}
返回object
。可以假定您指的是特殊的内部[[call]]方法,但措辞令人困惑indeed@bergi是的,我更改了where将Object.create(null)的措辞
fit in this class hierarchy?函数在JavaScript中的特征不是instanceof Function
,它们是特殊的,因为它们是可调用的对象。@Bergi-但是,函数是instanceof Function
Object.create(null)
有点奇怪,因为它没有原型。人们可以将其视为对象
的父对象,因为它提供了公共属性访问器语法。是的,您遇到的大多数函数都是函数
,但它们不一定是。它们可能来自另一个领域(框架),可能被操纵[[prototype]],或者只是带有错误实现的主机对象(oldIE的console.log
为此而闻名-现在,浏览器供应商希望尽量减少wtf时刻)@Bergi-所以,现在您已经不再描述一些例外instanceof
不适用于另一帧中的所有对象-这对于函数对象来说并不是什么新鲜事,例如instanceof Array
。而且,你的IE评论听起来像是一个bug。你认为我的回答中有什么需要纠正或改进的地方吗?