摘要:学习冴羽的博客判断两个参数是否相等
什么是“相等”
原本只要===
返回true就认为两者相等,但现在的相等是:
1.NaN与NaN相等
2.[1]与[1]相等
3.{value: 1}与{value: 1}相等
4.1与new Number(1)相等
5.’0’与new String(‘0’)相等
6.true与new Boolean(trun)相等
7.复杂对象具体看下面的讲解
+0与-0
产生+0与-0的原因:js采用了IEEE_754浮点数表示法,这种二进制表示法最高位是符号位(0表示正,1表示负),剩下的表示大小。对于边界值0来说无论是0开头的0000(+0)还是1开头的1000(-0)都表示0,因而有正负零的区别
1 | Math.round(-0.1) // -0 |
利用正负无穷来判断正负零
1 | functionequal(a, b){ |
NaN
利用NaN不等于自身的特性判断NaN
1 | functionequal(a, b){ |
初级equal函数
1 | functionequal(a, b) { |
至此,参数都是简单类型的相等判断已经搞定
包装对象、Date对象和RegExp对象
对于这三种对象来说,利用隐式转换来判断是否相等,但是有个特殊的包装对象Number(NaN)
,它的判断方法与NaN
一致
1 | var toString = Object.prototype.toString; |
构造函数实例
对于不同构造函数下的实例返回false
1 | var toString = Object.prototype.toString; |
数组与对象
简单的数组与对象递归遍历一遍判断每一项是否相等
1 | function deepEqual(a, b) { |
循环引用
有这样一种情况,对象里(多级嵌套)的一个属性指向它自己
1 | a = {abc: null}; |
underscore的方法是多传递两个参数——aStack和bStack,用来储存a和b递归比较过程中嵌套的对象,先判断一下是否为循环引用,不是循环引用的情况下再进行判断是否相等
1 | var a, b; |
最终的 equal 函数
1 | var toString = Object.prototype.toString; |