每个对象都是一个函数,每个函数都是对象——哪个是正确的?

IT技术 javascript
2021-03-08 23:55:15

我正在阅读此链接JavaScript_syntax

这似乎是循环的——每个函数都是一个对象,每个对象本身都是一个函数。哪个是原子的?有人可以以更好的方式解释吗?

6个回答
  1. 任何不是原始类型(未定义、空值、数字、字符串、布尔值)的东西都是 JavaScript 中的对象(或实例)。这意味着function继承自object.

  2. 对象实例可以包含更多可以是函数的实例。这就是我们所说的“方法”(因为它有一个自动this变量)。

  3. 由于您不能“调用”每个 Object 实例,因此并非每个对象都是一个函数。

@gurupriyan.e:试试这个:var obj={}; obj();那是“试图调用对象”(即像使用函数一样使用它)。不起作用。因此,任意对象不是函数。
2021-04-15 23:55:15
@FrustratedWithFormsDesigner:感谢您的澄清。
2021-04-16 23:55:15
关于#1 的问题,为什么typeof nullobject
2021-05-01 23:55:15
变量数 = 5; 在这一行中,num 是一个对象,因为它具有定义的属性和原型。这是正确的还是我遗漏了什么?字符串和布尔值应该相同吗?虽然,似乎 undefined 和 null 本身是完全不同的类型?
2021-05-04 23:55:15
函数是Function(可能确实继承自Object)的实例,如 OP 的链接文章中所述:en.wikipedia.org/wiki/JavaScript_syntax#Function
2021-05-14 23:55:15

我认为这个概念经常被误解。

一个可视化 JS 类型关系的实用程序http://jstype.herokuapp.com/#/home

Javascript 数据类型

  1. 原始类型 - 数字、字符串、布尔值、空值和未定义。
  2. 所有非原始类型都是object

var foo = { }; 
var foo = [1, 2, 3]; 
var foo = function abc() { return "hello world"; }; 
var foo = new Number(30); 
var foo = new String("Hello World"); 
var foo = new Boolean(true); 
var foo = new RegExp(/[foo]+/);

// All 'foo` are object. 

  1. 所有原始类型都有相应的构造函数wiz。Array, Number, String, Boolean, RegExp. 由于所有函数都是对象,因此它们也是对象。所以我们可以称它们为构造函数对象。

  2. 大多数非原始类型具有prototype所有继承的东西都存在的属性。数学没有原型。

  3. 继承自 的所有对象都Object.prototype继承自null
    object <- Object.prototype <- null

  4. 所有原生函数都继承自 Function.prototype,后者继承自 Object.prototype。
    function <- Function.prototype <- Object.prototype <- null

  5. 数组Array.prototype继承自Object.prototype
    array <- Array.prototype <- Object.prototype <- null

必须阅读MDN:继承和原型链
弄糊涂Stackoverflow:JavaScript 中的原型
Stack Overflow:函数原型解释

是否null继承了某些东西?
2021-04-16 23:55:15
var foo = function abc() { return "hello world"; }; typeof foofunction这里而不是object
2021-05-09 23:55:15
@Rahul 是的,但是instanceof Object返回 true。typeof运营商,与预期相反,并不总是带来的“根类型” -它在那里,如果特殊情况下Function.prototype的原型链中,它返回function,而不是根类型object从根本上说,所有函数仍然继承自Object.prototype. (这可以通过(function(){}) instanceof Object, 或确认(function(){}).__proto__.__proto__ == Object.prototype,两者都返回真。)
2021-05-11 23:55:15

每个函数都是一个对象。对象可以包含函数(方法),但对象不一定是函数。

Function始终是 的属性object

这意味着 JavaScript 中的所有函数总是绑定到一个对象。如果你没有指定一个对象来绑定一个函数到它绑定到的窗口对象(也称为全局函数)

..弗雷德里克

这个真的太棒了。
2021-05-07 23:55:15

最好说在 JavaScript 中一切都可以被视为对象,包括原始类型和函数类型;JavaScript 解释器所做的是,当您与它们交互时,它会自动将您的原语和函数提升为它们的对象包装器类型。

还有一个 Function 对象,它是 JavaScript 中其他原语的许多等效包装器,这意味着您甚至可以在函数实例上调用方法,例如:

myFunction(someArg).call(this)

话虽如此,并非每个对象实际上都是一个函数。

所以每Object一个都是一个函数!
2021-04-15 23:55:15
但是......每一个Object都是function Object() { [native code] }
2021-04-20 23:55:15
在语言级别区分Object构造函数/定义和实际object看到每个答案和评论都与前一个相反,真是令人痛苦。function Object是基础对象是如何定义的,但在引擎盖下它仍然是具有性质(一个对象lengthname等)。
2021-04-26 23:55:15
除非Object被重新定义为Object=null
2021-04-28 23:55:15
但在那种情况下,null 是一个原始类型,而不是一个对象 - 不是一个对象不是函数的有效示例。
2021-04-30 23:55:15