JavaScript中对象用==或===比较恒为false,因比较的是内存引用而非内容;仅当指向同一实例时===才为true;内容相等需浅比较(单层属性)或深比较(递归处理嵌套、循环引用等),推荐使用Lodash的_.isEqual()。

JavaScript 中直接用 == 或 === 比较两个对象,结果总是 false,哪怕它们的属性和值一模一样。这是因为对象比较的是引用地址,不是内容。
对象比较的是内存地址,不是结构和值
当你写 let a = {x: 1}; let b = {x: 1};,a 和 b 是两个独立对象,分别存放在不同内存位置。即使内容相同,a === b 仍为 false。
每个对象字面量或 new Object() 都会创建新引用 === 对对象只检查是否指向同一块内存 数组、函数、Date 等引用类型同理
浅比较:检查一层属性是否相同
适合简单对象(无嵌套、无函数、无特殊值),可用 Object.keys() + 循环实现:
先判断 key 数量是否相等 再遍历每个 key,检查 a[key] === b[key] 注意:NaN === NaN 是 false,需单独处理 无法识别 {a: undefined} 和 {} 的差异(因为 undefined 不可枚举)
深比较:递归检查所有嵌套层级
要真正判断“内容是否一致”,得递归比对每个属性值:
立即学习“Java免费学习笔记(深入)”;
遇到对象/数组,继续递归;遇到原始值,直接用 === 需处理循环引用(比如 a.b = a),否则栈溢出 要考虑 null、NaN、0 与 -0、正则、日期等特殊类型 实际项目中建议用成熟库,如 Lodash 的 _.isEqual()
什么时候能用 === 安全比较?
只有当两个变量确实指向同一个对象实例时,=== 才有意义:
let obj = {x: 1}; let a = obj; let b = obj; a === b // true 常用于状态变更判断(如 React 中 prevProps.user === nextProps.user) 或校验是否被意外替换(如配置对象是否还是初始引用)
基本上就这些。对象不相等不是 bug,是语言设计使然——它把“身份”和“内容”分得很清楚。想比内容,就得自己定义怎么比。
以上就是javascript如何比较两个对象_为什么说它们不完全相等?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1543247.html
微信扫一扫
支付宝扫一扫