您现在的位置是:亿华云 > 数据库
JavaScript 中的 4 个相等比较算法的介绍
亿华云2025-10-09 13:05:29【数据库】2人已围观
简介JavaScript 运算中,一共包含 4 个相等比较算法:抽象相等比较 严格相等比较 SameValueZero SameValue 可以这么
JavaScript 运算中,个相一共包含 4 个相等比较算法:
抽象相等比较 严格相等比较 SameValueZero SameValue可以这么说,等比只要你做过相等比较,较算介绍你就在使用四个算法中的个相一个。因为这些算法部署在了涉及到相等比较的等比操作符或方法中。
参见下表:
怎样区分这些算法的较算介绍不同呢,可以从两方面切入:
是个相否会发生类型转换 对 NaN、-0、等比+0(即 0) 这些值是较算介绍否存在特殊处理下面给出一个总结:
就是说,抽象相等比较算法会发生类型转换,个相SameValue 算法不会特殊对待 NaN、等比-0、较算介绍+0 这些值。个相
类型转换如何进行的等比?
上面讨论的四种算法中,只有“抽象相等比较算法”会发生类型转换。较算介绍发生类型转换的前提是:比较的两个值类型不同,而且转换结果是数值。
举个例子:
1 == 1 // true(未发生类型转换) 1 == 1 // true(发生了类型转换)第一个比较为 true,好理解;第二个就不一样了,会发生类型转换——将非数字值转为数字:1 跟 1 比较,两者类型不同,1 是网站模板字符串,因此会先转为数字——也就是 1(Number(1)),结果变为两个 1 在一起比较,结果就是 true 了。
“抽象相等比较算法”还有一个比较怪癖的地方,在于规范中定义 null == undefined 返回结果为 true。按理说应该发生类型转换,再进行比较的,比较结果应为 false(null 转为 0,undefined 转为 NaN,两者不等)。

规范中对抽象相等比较算法搞了一个“小怪癖”:定义 null 和 undefined 的比较结果为 true
我猜想,这一定义可能是为了保证向前兼(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) // true Object.is(0, -0) // falseSameValueZero 算法,通过名称我们可能就猜到,与 SameValue 算法的区别,仅仅是对“零”的态度上——SameValueZero 算法不能区分 +0 和 -0。
就是说:
var array = [NaN, -0] array.includes(NaN) // true array.includes(0) // truearray.includes(0) 的结果没有返回 false,企商汇是因为其内部使用的 SameValueZero 算法不能区分 +0 和 -0。
很赞哦!(85)
站长推荐
tk域名是什么域名?新手对tk域名有什么看法?
前端:收集前端开发者手边必备的11款神器
为什么启动线程不直接调用run(),而要调用start(),如果调用两次start()方法会有什么后果
浅探 Web Worker 与 JavaScript 沙箱
为了避免将来给我们的个人站长带来的麻烦,在选择域名后缀时,我们的站长最好省略不稳定的后缀域名,比如n,因为我们不知道策略什么时候会改变,更不用说我们将来是否还能控制这个域名了。因此,如果站长不是企业,或者有选择的话,如果不能选择域名的cn类,最好不要选择它。
阿里终面:优秀的代码都是如何分层的?
苹果AR/VR显示专利:主要和次要双屏幕组合设计
干货技巧!不需要任何工具,10个案例让Python执行速度飞速提升