START
- 记录一下数组对比的问题,下次不要犯这种低级错误。
- 同事写了一个bug,进入页面,疯狂的一直调用一个接口。
debugger
定位问题,发现同事写了一个很离谱的if
语句。 - 简单来说 他写了一个if语句,如果两个变量相等,不执行后续逻辑;不相等,调用数据获取接口。但是两个变量都是数组,(引用数据类型,必然是不会相等的)就导致了问题发生。
问题详细解读
image.png e2e3be7dba6793a2fee5213bedde2e4.png问题既然找到了,那就这里详细说明一下,问题出现的原因。
o(╥﹏╥)o,说来有点菜,看半天都没反应过来,这里是有问题的,后续同事指点才想起来,所以想写一篇博客记录一下。
- 其实道理很简单,就像
数组,对象
,都是引用类型,变量a和变量b都是存储的[1,2,3]
在堆中的引用地址,两者对比,肯定是不相等的。 - 知道这个原理,就会发现,这个bug其实很简单。
两个数组如何比较值
是否相等?
-
上述问题已经描述清楚了,那我们如何解决掉这个bug呢,显然直接全等于进行比较是有问题的,那么如何对比两个数组?
-
查看了很多有关于
js
中数组对比的方案,没找到比较靠谱的方案,但是我依旧整理了一下我个人收集的,对比两个数组的方法。
方法
将数组转换成字符串,对比两个字符串是否完全相等
let a=[1,2,3]
let b=[1,2,3]
console.log(a.toString(),b.toString(),a.toString()===b.toString())
console.log(JSON.stringify(a),JSON.stringify(b),JSON.stringify(a)===JSON.stringify(b))
打印效果
1,2,3 1,2,3 true
[1,2,3] [1,2,3] true
弊端(这种方式依旧存在一些弊端)
有一说一这种方式是百度到的最常见的,而且的最方便的,但是依旧会存留问题
1.数组顺序不一致,(可以使用.srot()
做一下排序)
2.由于转义成了字符串,会导致原本是数字的数据,会变成字符串类型,可能会影响对比的准确性
END
- 暂时没有发现更好的更完善的能够兼容所有情况的数组对比的案例,后续发现了在做补充
- 理论上也应该举一反三,除了数组对比,对象对比,也应该考虑
网友评论