送人玫瑰,手留余香。回味一下余香,并总结记录。
语言: JS 框架: React 开发编辑器: VSCode 问题提出者:同事小G
同事小G,想比较两个对象是否相同,他提供了代码发现return 退不出函数。
提供代码如下:
// 判断对象是否相等
const isEqual = (obj1, obj2) => {
if (Object.keys(obj1).length !== Object.keys(obj2).length) {
return false;
}
for (let attr in obj1) {
if (obj1[attr] instanceof Object && obj2[attr] instanceof Object) {
isEqual(obj1[attr], obj2[attr]); // 如果值为对象再递归进行判断
} else if (obj1[attr] !== obj2[attr]) {
return false;
}
}
return true;
};
调用 isEqual
发现函数永远返回 true
看了代码发现,小G同学使用了递归。递归其实是一层套一层的。
如果在第一层函数里,调用这个函数,其实在内存第二个函数在第一个函数的作用域里。return 同样原理,你需要一层一层才能从第一层退出去。
代码中只是从最后一次递归的时候退出了这次函数,并没有全部退出,所以函数走完并没有return ,永远调用最后的 return true
按照递归逻辑一层一层返回即可。也就是在递归的时候return 出去这一层
return isEqual(obj1[attr], obj2[attr]); // 递归的时候return 出去
修改之后:
// 判断对象是否相等
const isEqual = (obj1, obj2) => {
if (Object.keys(obj1).length !== Object.keys(obj2).length) {
return false;
}
for (let attr in obj1) {
if (obj1[attr] instanceof Object && obj2[attr] instanceof Object) {
return isEqual(obj1[attr], obj2[attr]); // 如果值为对象再递归进行判断
} else if (obj1[attr] !== obj2[attr]) {
return false;
}
}
return true;
};
基础知识递归掌握不熟练引起,另外在项目中油很多方法判断js对象是否相等。
JSON.stringify(object1) === JSON.stringify(object2);
_.isEqual(value, other)
执行深比较来确定两者的值是否相等。
**注意: **这个方法支持比较 arrays, array buffers, booleans, date objects, error objects, maps, numbers, Object objects, regexes, sets, strings, symbols, 以及 typed arrays. Object 对象值比较自身的属性,不包括继承的和可枚举的属性。 不支持函数和DOM节点比较。
var object = { 'a': 1 };
var other = { 'a': 1 };
_.isEqual(object, other);
// => true
object === other;
// => false