前端js对象判等的最佳方式

AI 概述
常见的“笨方法”最优方式:深度比较有没有更偷懒的方法?总结 前端在日常开发中,我们经常会遇到这样的场景: 需要判断两个对象是否“相等”。比如接口返回的数据有没有变化、表单值和初始值是否一致、缓存是否更新…… 问题来了,==或===能解决吗? 答案是:不行。 看个例子: const obj1 = { name: 'Tom'...
目录
文章目录隐藏
  1. 常见的“笨方法”
  2. 最优方式:深度比较
  3. 有没有更偷懒的方法?
  4. 总结

前端 js 对象判等的最佳方式

前端在日常开发中,我们经常会遇到这样的场景:

需要判断两个对象是否“相等”。比如接口返回的数据有没有变化、表单值和初始值是否一致、缓存是否更新……

问题来了,==或===能解决吗?

答案是:不行。

看个例子:

const obj1 = { name: 'Tom' };
const obj2 = { name: 'Tom' };

console.log(obj1 === obj2); // false

为什么?

因为===比较的是引用地址,两个对象内容一样,但存在不同的内存地址,所以结果是 false。

那该怎么办?

常见的“笨方法”

很多人会直接想到一个办法:

JSON.stringify(obj1) === JSON.stringify(obj2);

原理:把对象转换成字符串再比较。
看起来挺香,但其实有两个坑:

  1. 属性顺序不同会比较失败
    const a = { x: 1, y: 2 };
    const b = { y: 2, x: 1 };
    
    console.log(JSON.stringify(a) === JSON.stringify(b)); // false
  2. 会忽略一些特殊值(如 undefined、Symbol、函数)。

所以,这个方法只能用在简单场景,不是最优。

最优方式:深度比较

要真正判断对象是否相等,就要递归地比较每个属性。
核心逻辑:

  • 如果不是对象,直接===比较。
  • 如果是对象,比较键数量和每个键的值。>

代码示例:

function isEqual(obj1, obj2) {
if (obj1 === obj2) returntrue; // 同一引用或原始值相等

if (typeof obj1 !== 'object' || typeof obj2 !== 'object' || obj1 == null || obj2 == null) {
    returnfalse; // 其中一个不是对象
  }

const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);

if (keys1.length !== keys2.length) returnfalse;

for (let key of keys1) {
    if (!keys2.includes(key) || !isEqual(obj1[key], obj2[key])) {
      returnfalse;
    }
  }

returntrue;
}

测试一下:

console.log(isEqual({ a: 1, b: { c: 2 } }, { a: 1, b: { c: 2 } })); // true
console.log(isEqual({ a: 1 }, { a: 1, b: 2 })); // false

这才是真正的“内容相等”。

有没有更偷懒的方法?

如果你在项目中已经用了 Lodash,可以直接用它的 _.isEqual(),稳定高效,边界情况都帮你处理好了:

import { isEqual } from 'lodash';

console.log(isEqual(obj1, obj2));

总结

  • ===比较的是引用,不适合对象内容比较。
  • JSON.stringify 只适合简单对象,不是万能解。
  • 最优解:递归比较,或者直接用 Lodash.isEqual。

所以,下次判断对象是否相等,不要再被 === 迷惑啦!

以上关于前端js对象判等的最佳方式的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 前端js对象判等的最佳方式

发表回复