关于 instanceof 的疑问

2020-12-04 10:28:24 +08:00
 rodrick

Array instanceof Object 为什么是 true 呢,MDN 上说

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

[] instanceof Objecttrue 我能理解

Array 算是一个实例对象么? 有点没搞懂

1646 次点击
所在节点    JavaScript
12 条回复
nikandaoleshenme
2020-12-04 10:31:09 +08:00
万物皆对象?
VDimos
2020-12-04 10:35:52 +08:00
js 啥都是 Object,不信你看它 prototype
wunonglin
2020-12-04 10:37:20 +08:00
Array 本质也是个对象。。。,你可以通俗理解为

```
class Array {
constructor(){}
}
```


然后根据 mdn 的解释是:JavaScript 的 Array 对象是用于构造数组的全局对象,数组是类似于列表的高阶对象。

参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
vision1900
2020-12-04 10:39:40 +08:00
JavaScript 分 2 种类型:简单类型和对象。
简单类型包括:number, string, boolean, null, undefined, 还有最近的 BigInt, Symbol 。
其他类型都是对象。Array 特殊一点,他是个构造函数又是个对象,而且是内置的。
证明是函数: typeof Array === "function"
证明是对象:其实不用证明,函数就是对象。非得证明的话,呃,你自己已经证明了:Array instanceof Object 。
建议深入了解下原型链
Reapper
2020-12-04 10:40:48 +08:00
Object instanceof Function, Array instanceof Function, Function instanceof Object 对象分为普通对象和函数对象
rodrick
2020-12-04 10:40:57 +08:00
@nikandaoleshenme
@VDimos
@wunonglin
@vision1900
想起来了。。Object.prototype.toString.call(Array) => [object Function]
确实是对象,自己给自己整晕乎了。。
tabris17
2020-12-04 10:41:19 +08:00
因为 Array.__proto__.__proto__ == Object.prototype 是 true
iidear2015
2020-12-04 10:46:13 +08:00
// Object 的 prototype 属性出现在了 Array 的原型链上
Object.prototype === Array.__proto__.__proto__ // true
morethansean
2020-12-04 10:54:21 +08:00
你自己都回答了……
Array.__proto__.__proto__ === Object.prototype

另外,MDN 中文这个实例对象是中文翻译自己加的描述,其实没有实例对象这个概念,或者说实例对象的定义就是 instanceof 的定义,那就是要么 Symbol.hasInstance 返回 true 了要么就是 constructor 的 prototype 出现在了 object 的原型链上:
object instance of constructor
auroraccc
2020-12-04 11:04:17 +08:00
Array 是一个函数哇,函数本身就是一个对象
rodrick
2020-12-04 11:25:30 +08:00
@morethansean 对,主要是看到 MDN 的翻译说“实例对象”,个人觉得对象和实例不是一个概念,一下没反应过来,看了下英文的原文就是 object
ConnJiang
2020-12-08 20:25:29 +08:00
Array 是构造函数 函数源于对象

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732010

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX