【问题标题】:Why is Array instanceof Object?为什么是 Array instanceof Object?
【发布时间】:2014-12-01 02:08:08
【问题描述】:

我在 javascript 中使用 instanceof 时偶然发现了以下内容。

Array instanceof Object
returns true

Object instanceof Array
returns false

这里的Array和Object是什么关系?

【问题讨论】:

标签: javascript


【解决方案1】:

构造函数之间的关系或prototype chain是:

Array -> Function.prototype -> Object.prototype
Object -> Function.prototype -> Object.prototype

第一个是true,因为构造函数是Function,而函数本身就是对象。

Array instanceof Function // true
Object instanceof Function // true

(function () {}) instanceof Object // true

【讨论】:

    【解决方案2】:

    您正在测试Array 构造函数。 Array 构造函数是用于创建数组的函数。所以Array instanceof Function 为真,Array instanceof Object 为真(因为所有 JS 对象都继承自 Object 原型。但由于这是一个构造函数,而不是实际数组 Array instanceof Array 为假。

    Object 是 Object 构造函数,所有对象都继承自该构造函数。因为它仍然是一个函数,Object instanceof Function 是真的,Object instanceof Object 也是如此。

    这些都不是你真正想要测试的(我认为)。我们可以测试一个实际的数组(而不是构造函数)

    [] instanceof Array[] instanceof Object 为真(而[] instanceof Function 为假)。这是因为所有数组都是数组,所有数组都是对象,但数组不是函数。

    我们也可以测试一个对象并得到

    {} instanceof Object 为真,但{} instanceof Array{} instanceof Function 为假。

    这里的关键点

    1. Array 是对构造函数的引用,而不是实际的数组。构造函数就是函数,所有的函数都是对象。

    2. 一个实际的数组是一个数组,这意味着它是一个对象,但不是一个函数。

    3. 在幕后instanceof 正在查找对象“原型链”以查找它继承的任何构造函数。

    【讨论】:

      【解决方案3】:

      数组是对象,但对象不是数组。 Object 是 Javascript 中的基类,如果它不是原始类型,那么它就是一个对象,因此数组属于其中。但当然对象不一定是数组。

      【讨论】:

      • 哦,好的,需要记住 C 才能理解这一点。
      • 这个答案实际上并没有解决这个问题。在表达式Array instanceof Object 中,没有数组,因此“数组是对象”这句话虽然为真,但实际上并不适用。
      • 这个答案忽略了这样一个事实,即 OP 正在检查 Array 构造函数,而不是数组 instance
      【解决方案4】:

      Array(第一个大写字母)是 JavaScript 中所有数组的“类对象”的名称。 那个“类对象”是一个对象,所以instanceof Object 因为它是true

      但 Object“类对象”不是数组 - Object 在其继承链中没有 Array 类。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-09
        • 2015-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-21
        相关资源
        最近更新 更多