【问题标题】:JavaScript: in what sense are objects `{}` and arrays `[]` the same or differentJavaScript:在什么意义上对象`{}`和数组`[]`相同或不同
【发布时间】:2019-02-01 03:57:03
【问题描述】:

我正在尝试理解以下输出:

'use strict';
console.log(Object.getPrototypeOf([]));
// [] 
console.log(Object.getPrototypeOf(Array.prototype));
// {}
console.log(Object.getPrototypeOf([]) == Array.prototype);
// true
console.log(Object.getPrototypeOf([]) === Array.prototype);
// true
console.log([]=={});
// false
console.log([]==={});
// false

特别是,为什么第 6 行和第 8 行被评估为 true,而第 10 和 12 行被评估为 false.#

编辑:我在第 6 行和第 8 行犯了一个愚蠢的错字,现在我已经对其进行了编辑。这使得问题不同。道歉。

【问题讨论】:

标签: javascript arrays javascript-objects


【解决方案1】:

在第 6 行和第 8 行中,您实际上是在比较两个完全相同的表达式。

对于任何 X,

(X)===(X) 总是1为真,在这种情况下,(X)==(X) 也自动为真(并非总是相反)。

[]{} 不相同,因此第 10 行和第 12 行中的 false

(1) 当然假设X 是非破坏性或只读表达式,如果X 类似于(Y++),那么这不成立。

【讨论】:

  • 另外{} === {}[] === [] 都是假的,所以不像(X)===(X) is always true for any X那么容易
  • @iuliu.net 因为[]x 不同,但更像new x()(它会创建一个新实例)每次被调用。如果你这样做var x = []; x === x,你会得到预期的结果。
  • 是的,假设 X 是可变的,好吧,它是正确的(当然假设没有应用代理)。但答案假设X 是一个表达式,在这种情况下我的澄清是成立的。
  • 请注意,我添加了一条关于假设 X 是非破坏性或只读表达式的评论。 []{} 都不是只读表达式。
【解决方案2】:

[] 将创建一个 new 数组实例。两个实例彼此不同(您可以独立修改它们)。 {} 也是如此,它会创建一个新的对象实例。

所有数组实例共享同一个原型实例(只有一个数组原型实例)。数组原型的原型是一个对象。

它们恰好具有相同的字符串/JSON 表示。

您在第二个console.log 示例中所做的基本上是:console.log(Object.getPrototypeOf(Object.getPrototypeOf([])))

最后两行返回 false,因为您正在比较对象和数组(不能相等)

【讨论】:

    【解决方案3】:

    Javascript 中的所有原型最终都继承自同一个对象原型。这就是为什么如果你将一个属性添加到对象原型,你程序中的所有对象最终都会有这个属性。 在第 6 行和第 8 行中,您正在比较 Object.prototype 到自己,这是相等的。

    但是在第 10 行和第 12 行中,您正在比较 2 个不同的对象,它们可能共享相同的原型,但它们在内存中完全是两个不同的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2018-11-03
      相关资源
      最近更新 更多