在JavaScript中,判断两个对象是否相等有多种方法,取决于你对 相等 的定义以及对象属性的类型。以下是几种常见的方法:
1.严格相等运算符 (===)
(资料图片仅供参考)
使用 === 运算符可以比较两个对象是否引用同一个对象。如果两个变量引用了同一个对象,则它们是相等的,否则它们是不相等的。例如:
const obj1 = { a: 1 };const obj2 = { a: 1 };const obj3 = obj1;console.log(obj1 === obj2); // falseconsole.log(obj1 === obj3); // true
在上面的例子中, obj1 和 obj2 的属性值相同,但它们是不同的对象,因此它们的 === 比较返回 false 。而 obj1 和 obj3 引用了同一个对象,它们是相等的,因此 obj1 === obj3 返回 true 。
这里就是严格比较,引用地址和属性名属性值都要一一对应。
2. 对象属性的比较
如果你只是需要比较两个对象的属性是否相等(不比较引用地址),你可以使用循环或 Object.keys 方法来获取对象属性的列表,并比较它们的值。例如:
function isObjectEqual(obj1, obj2) { const obj1Keys = Object.keys(obj1); const obj2Keys = Object.keys(obj2); if (obj1Keys.length !== obj2Keys.length) { return false; } for (let key of obj1Keys) { if (obj1[key] !== obj2[key]) { return false; } } return true;}const obj1 = { a: 1, b: "hello" };const obj2 = { a: 1, b: "world" };const obj3 = { a: 1, b: "hello" };console.log(isObjectEqual(obj1, obj2)); // falseconsole.log(isObjectEqual(obj1, obj3)); // true
在上面的例子中, isObjectEqual 函数比较了 obj1 和 obj2 的属性值并返回 false ,因为它们的 b 属性的值不相等。而 isObjectEqual(obj1, obj3) 返回 true ,因为它们的所有属性值都相等。
3. 使用 Lodash 等工具库判断两个对象是否相等
可以使用 Lodash 的 isEqual 方法(依然不比较引用地址)。 isEqual 方法会递归比较两个对象的属性值是否相等,包括嵌套对象和数组。
const obj1 = { a: 1, b: { c: 2 } };const obj2 = { a: 1, b: { c: 2 } };const obj3 = { a: 1, b: { c: 3 } };console.log(_.isEqual(obj1, obj2)); // trueconsole.log(_.isEqual(obj1, obj3)); // false
在上面的例子中, _.isEqual(obj1, obj2) 返回 true ,因为它们的所有属性值都相等,包括嵌套的对象。而 _.isEqual(obj1, obj3) 返回 false ,因为它们的 b.c 属性的值不相等。
4. JSON.stringify 方法
如果你的对象中只包含简单类型(如数字、字符串、布尔值和 null)以及其他对象或数组,则可以使用 JSON.stringify 方法将对象转换为字符串,然后比较这些字符串(还是不比较引用地址)。例如:
const obj1 = { a: 1, b: "hello", c: true };const obj2 = { a: 1, b: "hello", c: true };const obj3 = { a: 1, b: "world", c: true };console.log(JSON.stringify(obj1) === JSON.stringify(obj2)); // trueconsole.log(JSON.stringify(obj1) === JSON.stringify(obj3)); // false
在上面的例子中, JSON.stringify(obj1) 和 JSON.stringify(obj2) 都返回相同的字符串,因此它们的比较返回 true 。而 JSON.stringify(obj1) 和 JSON.stringify(obj3) 返回不同的字符串,因此比较返回 false 。
需要注意的是,这种方法只适用于简单类型和嵌套对象或数组,因为它无法处理对象中包含函数、正则表达式和 Date 等类型的情况。
5. 使用 Object.is() 方法
它与 === 运算符类似,但是有一些特殊情况,例如 Object.is(+0, -0) 返回 false ,而 === 运算符返回 true 。
const obj1 = { a: 1 };const obj2 = { a: 1 };const obj3 = obj1;console.log(Object.is(obj1, obj2)); // falseconsole.log(Object.is(obj1, obj3)); // true
在上面的例子中, Object.is(obj1, obj2) 返回 false ,因为 obj1 和 obj2 是两个不同的对象,而 Object.is(obj1, obj3) 返回 true ,因为 obj1 和 obj3 引用了同一个对象。
无论你使用哪种方法,都需要明确你对 相等 的定义以及对象属性的类型,并选择适合你需求的方法。
标签:
在JavaScript中,判断两个对象是否相等有多种方法,取决于你对相等的定义以及对象属性的类型。以下是几种常
数字人民币是一项重要的金融科技创新成果,推广数字人民币的使用有利于为社会创造更大价值,是推动数字中国
5月7日电水利部7日发布汛情通报,5月5日以来,我国江南大部、华南北部、西南东北部等地出现强降雨。受强降
今年以来,半导体板块的走势一波三折,先是走出一轮凌厉的反弹攻势,此后连续回调。与此同时,越来越多公募
1、面对压力首先要保持好的心态,积极面对难题,如果压力太大,可以学会内自我调节,容以适当方式宣泄自己
马龙谈布克:知道他能命中高难度进球但我们给他太多轻松机会,职业生涯,丹佛掘金队,马龙谈布克,德文·布...
美国著名投资人沃伦·巴菲特6日在2023年伯克希尔-哈撒韦公司股东大会上表示,他旗下大多数企业今年盈利...
科技日报记者赵汉斌兰科是被子植物最大科之一,全世界约有700属2 8万种,不少种类是重要的观赏花卉和珍贵药
欢迎观看本篇文章,小勉来为大家解答以上问题。海南跨海大桥动工时间是什么时候,海南跨海大桥开工了嘛很多
湖南日报全媒体记者刘勇【名片】湖南日报编辑出版中心,是《湖南日报》内容生产的“总装车间”,获评202...
1、手机监控莹云石出现设备不在线可能是以下原因:(1)机器的网络没有连接而导致的提示不在线;(2)萤石
1、曜是虚拟的,有人说曜的原型是东方未明,而东方未明出自武林群侠传系列,并不是历史上存在过的人物。2、
1、亲爱的买家您好,感谢您对我们的支持!如果收到宝贝有什么问题,可以即可与我们联系。2、我们将竭尽全力
1、据专家分析,全世界有10万多种动物,猪的智商却被排在第10位 。2、经过培养的猪智商应该可以达到3~4岁幼儿
1、青丘狐传说的翁长亭饰演者是金晨,1990年9月5日山东于山东济南,毕业于北京舞蹈学院民族舞、音乐剧专业
一代人的青春又回来了!动画电影《灌篮高手》近期在我国上映,口碑票房均收获满满。其在北京大学举办的中国
2022年,储能行业快速发展,人才需求暴涨,员工人均薪资(到手薪酬+五险一金+补贴+奖励等)攀升。维科网储
【潮南暴雨黄色预警】受强降水云团影响,预计从现在起至18时,我区将出现暴雨降水,最大小时雨量可达15~30
最近很多小伙伴在游玩红霞岛的时候都出现了连接丢失的问题,这个很有可能是小伙伴们在游玩游戏的时候出现了
拒绝参数,只谈体验,关注导盲犬小抠,真实解读您熟悉的数码产品,本文阅读预计耗时3分钟。收音机产品的发
X 关闭
X 关闭