该项目的 GitHub 地址为 underscore-analysis,所有文章都在这里,并将不断更新。如果你觉得我的解读还可以,对你学习 js 有一定的帮助,欢迎 Watch && Star,你的关注和肯定必定会促使我投入更多的时间和经历做好这个系列。如果你愿意的话,也欢迎 Fork,我们一起来将这个系列做好做大,一起成长。
这篇文章接着上篇文章,继续学习 underscore 中关于数据判断的 API。上篇文章主要介绍了数据类型,以及数据是否为空,是否有限的判断。这篇文章只介绍一个方法,判断两个数据值是否相等。这个方法应该是 underscore 中代码量和注释最多的一个方法了。
源码
|
需要考虑的情况
1. 0 === -0
, 但是这里并不认为它们是相等的
|
这段代码先判断 a,b 是否全等
如果全等再将 a 跟 0 相比较,如果它等于 0,那么就会返回 false(-0 === 0,所以用 a 还是 b 比较都一样),如果不等于 0,那么就可以排除这种情况
因为 1 / 0 === Infinity
, 1 / -0 === -Infinity
,而 Infinity !== -Infinity
,所以也可以用 1 / a === 1 / b
来排除这种情况
2. null == undefined
但是这里并不认为它们相等
|
如果 a,b 中至少有一个是 null,那么就用全等判断它们是否相等
3. 如果 a,b 是下划线对象的实例
|
这种情况下,只需要比较 a,b 两个对象中的 _wrapped
属性值
因为调用下划线构造函数时,值是存在实例的 _wrapped
属性中的,具体可以看第一篇解读文章
也就是说可以不用比较 ab 从下划线对象中继承的属性和方法,直接比较实例化时添加的属性值即可,所以,就需要对 ab 重新赋值为它们各自的 _wrapped
属性值
4. 如果 a,b 是 RegExg,String,Boolean,Number,Date
类型的值
|
5. 如果 a,b 是 Array 或 Object 类型
|
6. 综合后源码
|