【问题标题】:IN javascript,why {}!==Object()?在 javascript 中,为什么是 {}!==Object()?
【发布时间】:2012-01-31 18:11:09
【问题描述】:

给定

    var o = {};
    var p = new Object();

    p === o; //false

    o.__proto__===p.__proto__  // true

为什么这是假的?

请告诉我返回 false 的直接原因??

【问题讨论】:

标签: javascript object


【解决方案1】:

这两个对象包含相同的东西(即什么都没有),但它们不是相同的对象。

Javascript 的对象相等性测试要求两个参数引用完全相同的对象

【讨论】:

  • 完全相同的对象是什么?
  • @caizZZz:考虑var o = {}; var p = o; po 指的是同一个对象。如果我修改p 的属性,o 也会被更改,因为它们都指向同一个实例。
  • 但是为什么o.__proto__===p.__proto__ // true
  • 因为 Object 原型不是在实例化时新生成的。 __proto__ 在这两种情况下仍然是指 Object 的原型。
  • @caizZZz:虽然__proto__ 的两个属性都指向同一个对象可能令人惊讶,但两个不同的 对象可以指向同一个对象也就不足为奇了其他对象。考虑:var foo = {}, bar = {x: foo, y: 42}, baz = {x: foo};。显然barbaz 不能是同一个对象,但bar.x === baz.xtrue
【解决方案2】:

对象is defined as===

11.9.6 严格等式比较算法

比较x === y,其中xy 是值,产生truefalse。这样的比较是这样进行的:

...

7。如果xy 引用同一个对象,则返回true。否则,返回 false.

在这种情况下,虽然两者都是空对象,但它们是分开创建的,因此不会引用同一个对象。

顺便说一句,两种结构都做同样的事情;但通常使用{}

【讨论】:

  • 为什么o.__proto__===p.__proto__ // 是的
  • @caizZZz:因为它们都继承自 Object.prototype(只有一个)。
【解决方案3】:

每次创建对象时,结果都有自己独特的标识。因此,即使它们都是“空的”,它们也不是一回事。因此=== 比较产生false

【讨论】:

    【解决方案4】:

    使用===,结果将显示两边的项目是否为“相同实例”

    如果你想比较两个相同类型的项目,你应该使用:

    var o1 = {};
    var o2 = new Object();
    
    alert( typeof(o1) === typeof(o2));
    

    如果您想判断两个对象是否相等(在属性和值中),您应该尝试underscore.js 库并使用isEqual 函数。

    【讨论】:

      【解决方案5】:

      这是作业吗?

      在那种情况下,我只会给你一些提示: - 想想前两行是做什么的。 o 和 p 在这两行之后是指同一个对象吗? - 查明 === 的作用。它是否比较两个对象以查看它们的结构是否相同?还是根据对象的身份比较对象?

      【讨论】:

        【解决方案6】:

        JavaScript 对象的严格比较测试两个表达式是否引用相同的对象(正常的等号运算符也是如此)。

        您使用对象字面量 {} 创建第一个对象,它创建一个没有属性的新对象。

        您通过将Object 构造函数作为函数调用来创建第二个对象。根据ECMAScript Language Specification 的第 15.2.1.1 节,这也会创建一个新对象,就像使用 new Object() 一样。

        因此您创建了两个对象,将它们的引用存储在po 下,并检查po 是否引用同一个对象。他们没有。

        【讨论】:

          【解决方案7】:

          对象属性的无序集合,每个属性都包含一个原始值、对象函数 .因此,每个对象都有属性和原型,没有任何意义进行比较。

          【讨论】:

            猜你喜欢
            • 2014-08-08
            • 1970-01-01
            • 2011-04-16
            • 1970-01-01
            • 2014-10-24
            • 1970-01-01
            • 2011-01-12
            • 2020-03-06
            • 1970-01-01
            相关资源
            最近更新 更多