在JavaScript中将一个新对象()与另一个新对象()进行比较

在JavaScript中将一个新对象()与另一个新对象()进行比较,javascript,Javascript,我创建了两个新对象: var a = new Object(); var b = new Object(); 经过比较,我得到了这些结果: var a=新对象(); var b=新对象(); console.log(a==b)//假的 控制台日志(a>b)//假的 控制台日志(b>a)//假的 console.log(a>=b)//真的 console.log(b>=a)//与=或相比,对象引用为true=(或==或!==)根据它们是否引用同一对象进行比较。如果是这样,他们是平等的;如果不是

我创建了两个新对象:

var a = new Object();
var b = new Object();
经过比较,我得到了这些结果:

var a=新对象();
var b=新对象();
console.log(a==b)//假的
控制台日志(a>b)//假的
控制台日志(b>a)//假的
console.log(a>=b)//真的

console.log(b>=a)//与
=
相比,对象引用为true=(或
==
!==
)根据它们是否引用同一对象进行比较。如果是这样,他们是平等的;如果不是,他们就不平等


但是关系比较运算符(
=
的行为完全如中所定义

  • a==b
    false
    ,因为它们引用的对象不同,定义如下:

  • 如果类型(x)与类型(y)相同,则

    a、 返回执行严格相等比较的结果x==y

  • 检查完所有其他类型后,其自身指定:

  • 如果x和y是相同的对象值,则返回true
  • 返回false
  • a
    false
    ,因为首先通过将操作数转换为非对象类型(对于对象,这将导致字符串表示形式为
    “[对象对象]”

    由于两个操作数将转换为相同的字符串值,因此它们将彼此相等


  • iirc,对象是通过引用存储的,所以它基本上是在内存中查看对象的地址。@杰里米·杰克逊:不,不是。您所做的不平等比较是比较字符串
    [对象]
    ,因为这种比较将操作数强制为字符串。这些字符串彼此不大于或小于,但大于或等于或小于或等于。它们不是相同的对象(=),而是相同的类型(,=)?2是错误的。
    r
    仅当其中一个值为
    NaN
    时才是
    未定义的
    ,而这里不是这种情况(两者都转换为字符串per)。您认为
    让px成为调用ToPrimitive(x,提示号)的结果如何。
    会吗?这会将
    x
    转换为数字或字符串。如果是“普通”对象将是一个字符串,因为
    valueOf
    不返回原语(请参阅我前面评论中的链接)。@Thriggle:看看是什么,然后看看步骤3的开头:“如果
    Type(px)
    不是
    string
    Type(py)
    都是
    string
    ,那么…”
    ToPrimitive(new Object())
    返回一个字符串。(这些链接指向5.1规范,以便与上面的注释一致,但它现在当然过时了。更容易阅读,但过时了。:-)传递给
    ToPrimitive
    的提示不是强制执行。它只是表示“如果可能,请给我一个数字”。唯一的效果是它在
    toString
    之前调用
    valueOf
    。但是在这种情况下,
    valueOf
    只返回对象本身。Oth,
    Date
    对象覆盖
    valueOf
    以返回一个数字,这就是为什么关系比较适用于开箱即用的
    Date
    对象。@T.J.Crowder谢谢!我将更新我的答案以使用更新的规范…我总是落入从MDN单击(旧)链接的陷阱,而不是自己去那里。@PatrickRoberts:LOL这不是那样的意思,不,但我明白你的意思。:-)另一个有趣的比较,原因相同:null==0为假,null>0为假,null>=0为真我喜欢JS,但是看着日期==比较是错误的,让我的头撞在桌子上…@gpinkas:是的。我和一个朋友开玩笑说,“也许用'is'和'isnot'运算符比较对象引用会更好,留下==和!=进行值比较。但是你知道,我们只会让人们问“为什么'1'是1'false?”;-)
    console.log(a == b);                 //false
    console.log(String(a) > String(b));  //false
    console.log(String(b) > String(a));  //false
    console.log(String(a) >= String(b)); //true
    console.log(String(b) >= String(a)); //true