如何在JavaScript中创建检查两个对象属性完全相同的函数?
解决对象全属性相等判断问题
你的代码逻辑存在核心问题:嵌套循环会只要找到任意一个属性值相等(哪怕属性名完全不同)就直接返回true,完全没实现「所有属性都相同才返回true」的需求。
修正思路
- 先校验两个对象的属性数量,数量不一致直接返回
false - 遍历其中一个对象的所有属性,逐一验证:
- 另一个对象是否包含该属性
- 属性值是否严格相等(
===)
- 只要有一项不满足,立刻返回
false;全部验证通过则返回true
修正后的代码
function BuildAddress(street, city, zipCode) { this.street = street; this.city = city; this.zipCode = zipCode; } const address1 = new BuildAddress('a', 'b', 101); const address2 = new BuildAddress('a', 'b', 101); const address3 = new BuildAddress('a', 'c', 101); // 用于测试属性不同的情况 function areEqual(obj1, obj2) { // 获取两个对象的自有属性名数组 const obj1Keys = Object.keys(obj1); const obj2Keys = Object.keys(obj2); // 属性数量不同,直接判定不相等 if (obj1Keys.length !== obj2Keys.length) { return false; } // 遍历所有属性逐一校验 for (const key of obj1Keys) { // 检查obj2是否存在该属性,且属性值严格相等 if (obj2[key] === undefined || obj1[key] !== obj2[key]) { return false; } } // 所有属性匹配,返回true return true; } // 测试示例 console.log(areEqual(address1, address2)); // 输出 true console.log(areEqual(address1, address3)); // 输出 false
额外说明
Object.keys()仅获取对象的自有可枚举属性,适配你用构造函数创建的实例场景- 严格相等
===会同时校验值和类型,避免101 == '101'这类非预期匹配 - 如果需要处理嵌套对象的相等判断,这个函数需要递归扩展,但当前场景下基础版本足够使用
内容的提问来源于stack exchange,提问作者Yuri Amancio
相关产品推荐
相关产品推荐

