【问题标题】:What is Function's Data Type : function or object? in JavaScript什么是函数的数据类型:函数还是对象?在 JavaScript 中
【发布时间】:2016-05-13 04:05:50
【问题描述】:

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 个对象)。函数不包含在任何地方。

直到现在,1年多,我认为函数的数据类型是对象,我听说函数是JavaScript中的一等对象,所以我对函数是对象没有怀疑,但今天我想了更多时间,想知道。

有什么不同吗?

【问题讨论】:

标签: javascript types


【解决方案1】:

您可以在逻辑上将Function 视为Object 的子类。它具有Object 的所有方法以及更多特定于函数的方法(例如.bind().call().apply() 等...)。

为什么 Javascript 决定让 Function 报告它自己的独特类型,而不是 Array(这是从 Object 的类似派生)是任何人的猜测,并且可能只有该语言的原始设计者才知道。 Function 确实报告了自己的类型非常有用,因此您可以轻松检查属性是否可作为函数调用,这也许是这样做的主要原因。

这里演示了 Function 对象如何拥有来自 Object 的方法:

function f() {}
f.someProperty = "foo";

log(f.hasOwnProperty("someProperty"));
log(f instanceof Object);
log(f instanceof Function);

function log(x) {
    var div = document.createElement("div");
    div.innerHTML = x;
    document.body.appendChild(div);
}

【讨论】:

  • Object.create(null) 适合这个类层次结构的什么位置?
  • functions 在 JavaScript 中不以 instanceof Function 为特征,它们是特殊的,因为它们是 callable 对象。
  • @Bergi - 但是,一个函数是instanceof FunctionObject.create(null) 有点奇怪,因为它没有原型。可以将其视为Object 的父级,我想是因为它提供了公共属性访问器语法。
  • 是的,你遇到的大多数函数都是Functions,但它们不是必须的。它们可能来自另一个领域(框架),它们的 [[prototype]] 可能被操纵,或者只是具有错误实现的宿主对象(oldIE 的 console.log 以这一点而闻名 - 这些天,浏览器供应商关心最小化 wtf 时刻)
  • @Bergi - 所以,现在你已经描述了一些例外情况。 instanceof 不适用于另一个框架中的所有对象 - 这对于函数对象来说并不是什么新鲜事,例如 instanceof Array 的相同问题。而且,您的 IE 评论听起来像是一个错误。您认为我的回答有什么地方需要更正或改进吗?
【解决方案2】:

typeof 返回传递给它的内容的类型。函数是一个对象 ((function () {}) instanceof Object === true),但是当提供给它的对象在 ECMA-262 中实现 [[Call]] 时,typeof 函数被定义为返回 "function"

函数是对象,但typeof 将它们视为特殊情况。

【讨论】:

  • “当一个带有call 方法的对象被提供给它时​​” - 我不敢苟同。 typeof {call:function(){}} 返回object
  • 有人可能会认为您的意思是特殊的内部 [[call]] 方法,但措辞确实令人困惑
  • @bergi 是的,我改了措辞
猜你喜欢
  • 2023-04-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多