比较两个元素是否相同
前言
之前就说过要读一下关于
underscore.js
的源码, 我就想先从某个函数开始读, 正好在github文章中(这里的文章我会在最后放上地址)提到了underscore
中关于如何比较两个元素的是否相同, 我看完之后觉得很好玩。那么对于如何判断两个元素是否是相同呢?那么在什么程度上才算是相同, 举个例子:1与1是相等的(当然他们前提是类型是一样的)
那么1
和new Number(1)
也应该相等。
underscore中有这么一个函数_.isEqual
对没错, 就是这个。接下来我会以自己的知识来解释下, 这个函数的涉及的知识点。 如果有解释的不好的点, 请大家给我留言我一定改正。话不多说直接开始。
分析_.isEqual
Number类型判断
console.log( _.isEqual(a, b));
我首先在 _.isEqual
中传入了两个参数a, b。首先明确两个概念: 其一是a, b都是基本类型, 那么两个基本类型的值相同。其二是两个是引用类型, 那么引用类型相同。如果a === b为true, 我们是否可以说a和b是相等的。但是这里有个特殊的就是0, -0。0与-0被浏览器认为是相等的。正确来讲0与-0是不相等的(关于这里我是看了文章里面有提到, 我在控制台打印了下, 发现很神奇)。关于这里_.isEqual
这样处理的。
if (a === b) return a !== 0 || 1 / a === 1 / b;
我理解是这样的: 这里过滤了99%情况, 但是没有过滤掉0与-0的情况。但是return里面如果a是0, 直接就return false结束。还有就是a如果为-0呢?第一个条件满足, 我们看第二个 1 / a(-0) === -Infinity
而1 / b(0) === Infinity
;所以第二个条件也不满足, 那么直接返回return false. ------游戏结束。上面这种判断处理就是针对0与-0这种情况。
接下来就是 a !== b
如果a或者b其中有一个为null
或者是unde