js 判断对象相等
文笔不是很好,一直在博客园属于那种只看不说的那种,有次心血来潮,想把自己的一些心得记录下来,我认认真真写了大半个小时,谁知一点保存,会话超时然后我的东西不知道去哪里,当时想死的心都有,写博客也就没那个兴趣了。平常遇到问题可能就和周围的同事讨论下,然后就是发发贴 ,看有什么解决方案么,但这种情况不是很理想,提出的问题不知道是别人没看懂,还是我没表述清楚,发出去的问题就像肉包子打狗一样,没有了下文。下面进入今天的主题吧。
在js 判断相等常见的就是 == (等同)和===(恒等);
==, 两边值类型不同的时候,要先进行类型转换,再比较 ;
===,不做类型转换,类型不同的一定不等。
例:
var a = 3;
var b = "3";
a==b 返回 true
a===b 返回 false
这个是基本类型相等的判断。
如果是对象的判断,那又会出现什么情况呢?
var People = function (id, name) {
this.id = id;
this.name = name;
}
var a = new People("3","小肖"); var b = new People("3","小肖"); var c = a; console.log("对象相等判断:"+ (a==b));//false console.log("对象相等判断:"+ (a==c));// true console.log("对象相等判断:"+ (b==c)); //false
console.log("对象相等判断:"+ (a===c));// true
对象都是按地址进行传递的, 这里我就自认为他们对象和java,C#一样比的对象的地址是否相等?在java中我们比较两个对象的值是否相等使用的是equal的方式,最终比的是对象的hashcode 是否相等,如果相等就可判断两个对象时等同的。在js中没有这样的函数,自然想起能否自己写一个通用的函数来做判断,自然想到如下方法:
var People = function (id, name) { this.id = id; this.name = name; } People.prototype.equal = function (obj) { if (obj instanceof People) { var result = true; for (k in this) { if (this[k] != obj[k]) { result = false; break; } } return result; } else { return false; } } var a = new People("3", "小肖"); var b = new People("3", "小肖"); var c = a; console.log("对象相等判断a equal b:" + (a.equal(b))); //true
好像现在能满足我的要求了,但是这只是在最一般情况下。如我对 a 或者b 进行简单的修改
a.value = 98; //对a 对象添加一个值,在java对象中显然不能这么做,但js中这样做不推荐,但并不排除 有人不这么干。 console.log( "对象相等判断a equal b:" + (a.equal(b))); //false delete a.value; b.value = 98; console.log( "对象相等判断a equal b:" + (a.equal(b))); //true |
在这种情况也许最简单的方式那 检查两个属性的长度是否相等就可以解决问题了,这样是可以解决问题,但是又有情况又出现了,请看
var People = function (id, name, arr) { this.id = id; this.name = name; this.group = arr; } People.prototype.equal = function (obj) { if (obj instanceof People) { var result = true; for (k in this) { if (this[k] != obj[k]) { result = false; break; } } return result; } else { return false; } } var a = new People("3", "小肖", [1, 2]); var b = new People("3", "小肖", [1, 2]); console.log("对象相等判断a equal b:" + (a.equal(b))); //false
当对象的字段 不是基本类型,而是对象,这个时候又不相等了。本来值是相等的,我们期待的结果是返回true。这个时候可能又会想到的解决方案是我们再进行类型判断。
如果是Object类型,或者数组等(即对象类型),我们再采用递归的方式来重复调用自己来做判断。这好像也行。但这样做是不是有点把问题搞复杂了,有么有更好的思路或者方法来解决这个问题呢?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探