先看几个结果
var a = {};
var b = {};
a > b // false
b < a // false
a == b // false
先看最后一个,如果没有前两个作对比,很多人直接就能得出正确的结果。除非是对象的同一个引用比较,否则对象与对象之前就是不相等的。
// 不同变量对同一个对象的引用
var a = {};
var b = a;
a == b // true
那a>b或者a<b发生生了什么?
复杂对象的比较会将对象转化为基础类型的值(string、number、boolean、null、undefined),{}会调用toString()进行转化。因为空对象没有自己定义toString(),所以委托给了Object.prototype.toString,这个函数会返回值的[[Class]],在这里也就是"[object Object]",是一个字符串。
进行比较的是两个相同的字符串,所以<和>比较都是false。但是进行==比较的时候又没有这种转化而直接对比引用地址,所以也返回false。
事情还没完。
var a = {};
var b = {};
a >= b // true
a <= b // true
>=的逻辑是:先进行<比较,将比较值取反就是>=的结果,<=的逻辑也是一样的。
不能将数学中的逻辑代入到编程中来,编程语言有很多和数学语言不一致的行为。遇到要小心,冷不丁就会被咬。
本文深入探讨JavaScript中对象的比较逻辑,解析对象与对象之间比较的底层实现,包括引用比较、类型转换及字符串化过程,揭示编程语言与数学逻辑的差异。
1763

被折叠的 条评论
为什么被折叠?



