在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