V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
rodrick
V2EX  ›  JavaScript

关于 instanceof 的疑问

  •  
  •   rodrick · 2020-12-04 10:28:24 +08:00 · 1879 次点击
    这是一个创建于 1484 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    [] instanceof Objecttrue 我能理解

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

    nikandaoleshenme
        1
    nikandaoleshenme  
       2020-12-04 10:31:09 +08:00
    万物皆对象?
    VDimos
        2
    VDimos  
       2020-12-04 10:35:52 +08:00 via Android
    js 啥都是 Object,不信你看它 prototype
    wunonglin
        3
    wunonglin  
       2020-12-04 10:37:20 +08:00   ❤️ 1
    Array 本质也是个对象。。。,你可以通俗理解为

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


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

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

    另外,MDN 中文这个实例对象是中文翻译自己加的描述,其实没有实例对象这个概念,或者说实例对象的定义就是 instanceof 的定义,那就是要么 Symbol.hasInstance 返回 true 了要么就是 constructor 的 prototype 出现在了 object 的原型链上:
    object instance of constructor
    auroraccc
        10
    auroraccc  
       2020-12-04 11:04:17 +08:00
    Array 是一个函数哇,函数本身就是一个对象
    rodrick
        11
    rodrick  
    OP
       2020-12-04 11:25:30 +08:00
    @morethansean 对,主要是看到 MDN 的翻译说“实例对象”,个人觉得对象和实例不是一个概念,一下没反应过来,看了下英文的原文就是 object
    ConnJiang
        12
    ConnJiang  
       2020-12-08 20:25:29 +08:00
    Array 是构造函数 函数源于对象
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 22:46 · PVG 06:46 · LAX 14:46 · JFK 17:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.