前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >改别人Bug 系列《递归中使用Return 问题》

改别人Bug 系列《递归中使用Return 问题》

作者头像
星宇大前端
发布2022-05-06 17:16:03
2650
发布2022-05-06 17:16:03
举报
文章被收录于专栏:大宇笔记

送人玫瑰,手留余香。回味一下余香,并总结记录。

项目场景:


语言: JS 框架: React 开发编辑器: VSCode 问题提出者:同事小G

问题描述


同事小G,想比较两个对象是否相同,他提供了代码发现return 退不出函数。

提供代码如下:

代码语言:javascript
复制
// 判断对象是否相等
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 出去

修改之后:

代码语言:javascript
复制
// 判断对象是否相等
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对象是否相等。

1. 转成json 字符串对比

代码语言:javascript
复制
JSON.stringify(object1) === JSON.stringify(object2);

2. lodash 工具函数

_.isEqual(value, other)

执行深比较来确定两者的值是否相等。

**注意: **这个方法支持比较 arrays, array buffers, booleans, date objects, error objects, maps, numbers, Object objects, regexes, sets, strings, symbols, 以及 typed arrays. Object 对象值比较自身的属性,不包括继承的和可枚举的属性。 不支持函数和DOM节点比较。

代码语言:javascript
复制
var object = { 'a': 1 };
var other = { 'a': 1 };
 
_.isEqual(object, other);
// => true
 
object === other;
// => false
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 项目场景:
  • 问题描述
  • 原因分析:
  • 解决方案:
  • 总结:
    • 1. 转成json 字符串对比
      • 2. lodash 工具函数
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档