当前位置: 首页 > 科技观察

JavaScript中4种相等比较算法介绍

时间:2023-03-14 11:10:53 科技观察

JavaScript运算总共包括4种相等比较算法:算法之一。因为这些算法是在涉及相等比较的运算符或方法中实现的。见下表:如何区分这些算法的区别可以从两个方面切入:是否会进行类型转换以及是否对NaN、-0、+0(即0)的值进行特殊处理这里总结一下:也就是说,抽象相等比较算法会进行类型转换,SameValue算法不会对NaN、-0、+0这些值进行特殊处理。类型转换是如何工作的?上面讨论的四种算法中,只有“抽象相等比较算法”进行了类型转换。类型转换的前提是要比较的两个值是不同的类型,转换结果是一个数值。例如:1==1//true(没有发生类型转换)'1'==1//true(发生类型转换)第一次比较为真,容易理解;第二个不同,会发生类型转换——将非数字值转换为数字:'1'与1比较,两种类型不同,'1'是字符串,所以会转换为数字first-即1(Number('1')),结果变成两个1一起比较,结果为真。《抽象相等比较算法》还有一个怪癖,就是规范中定义了null==undefined返回true。按理说应该发生类型转换,然后比较结果应该为false(null转为0,undefined转为NaN,两者不相等)。在规范中,抽象相等比较算法有一个“小怪癖”:定义null和undefined的比较结果为真。我猜想,这个定义可能是为了保证向前兼容(tián)兼容(kēng),所以我们记住了就是这样。其他情况以类型转换后的比较结果为准。NaN、-0和+0是如何被特殊对待的?在ES2015标准发布之前,并没有算法SameValueZero和SameValue。也就是说,只有两种算法:抽象相等比较和严格相等比较:这两种算法都有一个问题——无法区分NaN和+0、-0。所以在ES2015之前,我们会遇到这样的比较结果:NaN===NaN//false+0===-0//true[NaN].indexOf(NaN)//-1[0].indexOf(-0)//-1NaN不等于自己,+0等于-0。在意识中,我们可能无法接受“NaN不等于自己”的结果,但我们可以理解“+0等于-0”(均为0),但在某些符号位有的场景下意思——向左,+表示向右,所以区分+0和-0是有道理的。基于此,ES2015引入了SameValue算法,在Object.is()方法内部使用,比较两个值是否相等。Object.is(NaN,NaN)//trueObject.is(0,-0)//falseSameValueZero算法,从名字我们可以猜到,与SameValue算法的区别只是对“零”的态度——SameValueZero算法无法区分在+0和-0之间。也就是说:vararray=[NaN,-0]array.includes(NaN)//truearray.includes(0)//truearray.includes(0)的结果不会返回false,因为内部使用的SameValueZero算法不能区分+0和-0。