本文介绍JavaScript中判断两个对象内容是否相等的方法。首先指出ES6的Object.is仅比较引用地址,无法满足内容比对需求。随后详解一种基于遍历键名和键值的深度比较思路,包括检查引用、验证键名数组长度及内容,并遍历判断键值是否一致,最后提供完整实现代码供参考。
JavaScript对象内容相等性判断概述
本文详细解析如何利用JavaScript判断两个对象的内容是否完全一致,文中提供了详细的示例代码,对读者的学习或实际工作具有参考价值,建议感兴趣的用户仔细阅读。
在ES6标准中,存在一个用于判断对象相等性的方法,但该方法仅用于检测两个对象是否指向内存中的同一地址。
let obj1= {
a: 1
}
let obj2 = {
a: 1
}
console.log(Object.is(obj1, obj2)) // false
let obj3 = obj1
console.log(Object.is(obj1, obj3)) // trueconsole.log(Object.is(obj2, obj3)) // false
因此,当业务需求是比对两个对象内部的具体内容是否相同时,上述方法便不再适用。
对象内容深度比较的实现思路
若要实现对象内容的一致性比较,核心思路在于遍历并校验两个对象的所有键名及其对应的键值是否完全匹配:
第一步,需判断两个对象是否指向同一块内存地址。
第二步,利用Object.getOwnPropertyNames方法获取对象的所有键名并构成数组。
第三步,比较两个对象生成的键名数组是否完全相等。
第四步,遍历所有键名,逐一判断其对应的键值是否均相等。
完整代码实现与解析
let obj1 = {
a: 1,
b: {
c: 2
}
}
let obj2 = {
b: {
c: 3
},
a: 1
}
function isObjectValueEqual(a, b) {
// 判断两个对象是否指向同一内存,指向同一内存返回true
if (a === b) return true
// 获取两个对象键值数组
let aProps = Object.getOwnPropertyNames(a)
let bProps = Object.getOwnPropertyNames(b)
// 判断两个对象键值数组长度是否一致,不一致返回false
if (aProps.length !== bProps.length) return false
// 遍历对象的键值
for (let prop in a) {
// 判断a的键值,在b中是否存在,不存在,返回false
if (b.hasOwnProperty(prop)) {
// 判断a的键值是否为对象,是则递归,不是对象直接判断键值是否相等,不相等返回false
if (typeof a[prop] === 'object') {
if (!isObjectValueEqual(a[prop], b[prop])) return false
} else if (a[prop] !== b[prop]) {
return false
}
} else {
return false
}
}
return true
}
console.log(isObjectValueEqual(obj1, obj2)) // false
以上即为本文的全部内容,希望能为各位的学习带来帮助,同时也欢迎大家继续支持本站获取更多技术分享。