技术解析

关于 instanceof 的疑问
0
2021-08-11 06:05:38
idczone

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

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

[] instanceof Objecttrue 我能理解

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


万物皆对象?

js 啥都是 Object,不信你看它 prototype

Array 本质也是个对象。。。,你可以通俗理解为
```
class Array {
constructor(){}
}
```

然后根据 mdn 的解释是:JavaScript 的 Array 对象是用于构造数组的全局对象,数组是类似于列表的高阶对象。
参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

JavaScript 分 2 种类型:简单类型和对象。
简单类型包括:number, string, boolean, null, undefined, 还有最近的 BigInt, Symbol 。
其他类型都是对象。Array 特殊一点,他是个构造函数又是个对象,而且是内置的。
证明是函数: typeof Array === "function"
证明是对象:其实不用证明,函数就是对象。非得证明的话,呃,你自己已经证明了:Array instanceof Object 。
建议深入了解下原型链

Object instanceof Function, Array instanceof Function, Function instanceof Object 对象分为普通对象和函数对象





想起来了。。Object.prototype.toString.call(Array) => [object Function]
确实是对象,自己给自己整晕乎了。。

因为 Array.__proto__.__proto__ == Object.prototype 是 true

// Object 的 prototype 属性出现在了 Array 的原型链上
Object.prototype === Array.__proto__.__proto__ // true

你自己都回答了……
Array.__proto__.__proto__ === Object.prototype
另外,MDN 中文这个实例对象是中文翻译自己加的描述,其实没有实例对象这个概念,或者说实例对象的定义就是 instanceof 的定义,那就是要么 Symbol.hasInstance 返回 true 了要么就是 constructor 的 prototype 出现在了 object 的原型链上:
object instance of constructor

Array 是一个函数哇,函数本身就是一个对象

对,主要是看到 MDN 的翻译说“实例对象”,个人觉得对象和实例不是一个概念,一下没反应过来,看了下英文的原文就是 object

Array 是构造函数 函数源于对象

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服