Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是函数';s数据类型:函数还是对象?在JavaScript中_Javascript_Types - Fatal编程技术网

什么是函数';s数据类型:函数还是对象?在JavaScript中

什么是函数';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(

MDN说:

六种基本数据类型:

  • 布尔值
  • 空的
  • 未定义
  • 符号(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。你认为我的回答中有什么需要纠正或改进的地方吗?