javascript对“对象”进行比较时候的诡异结果

本文深入探讨JavaScript中对象的比较逻辑,解析对象与对象之间比较的底层实现,包括引用比较、类型转换及字符串化过程,揭示编程语言与数学逻辑的差异。

先看几个结果

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

>=的逻辑是:先进行<比较,将比较值取反就是>=的结果,<=的逻辑也是一样的。

不能将数学中的逻辑代入到编程中来,编程语言有很多和数学语言不一致的行为。遇到要小心,冷不丁就会被咬。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值