JavaScript 中的 4 个相等比较算法的介绍
JavaScript 运算中,一共包含 4 个相等比较算法:
可以这么说,只要你做过相等比较,你就在使用四个算法中的一个。因为这些算法部署在了涉及到相等比较的操作符或方法中。 参见下表: 怎样区分这些算法的不同呢,可以从两方面切入:
下面给出一个总结: 就是说,抽象相等比较算法会发生类型转换,SameValue 算法不会特殊对待 NaN、-0、+0 这些值。 类型转换如何进行的? 上面讨论的四种算法中,只有“抽象相等比较算法”会发生类型转换。发生类型转换的前提是:比较的两个值类型不同,而且转换结果是数值。 举个例子:
第一个比较为 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 与自身不相等,+0 等于 -0。在意识中,我们可能接受不了“NaN 与自身不相等”的结果,但是能够理解“+0 等于 -0”(都是 0 嘛),但是在某些符号位具有含义的场景中——- 表示向左,+ 表示向右,那么区分 +0 等于 -0 就有意义了。 基于此,ES2015 中引入了 SameValue 算法,Object.is() 方法内部就是使用此算法,比较两个值是否相等。
SameValueZero 算法,通过名称我们可能就猜到,与 SameValue 算法的区别,仅仅是对“零”的态度上——SameValueZero 算法不能区分 +0 和 -0。 就是说:
array.includes(0) 的结果没有返回 false,是因为其内部使用的 SameValueZero 算法不能区分 +0 和 -0。
【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。 |
-
Java性能优化:35个小细节,提升你的Java代码运行效率
前言 代码优化 ,一个很重要的课题。可能有些人觉得没...[详细]
-
作为一名新手Python程序员,你首先需要学习的内容之一...[详细]
-
Kafka作为时下开源消息系统,被广泛地应用在数据缓冲...[详细]
-
MongoDB集群有副本集及主从复制两种模式,不过主从模...[详细]
-
本文介绍如何使用Python制作一个简单的猜数字游戏。 ...[详细]
-
项目中为什么一定要用Spring?什么是Spring四种策略?
相信每个Java开发人员在工作、学习中都了解Spring怎么...[详细]
-
一、限流基础知识介绍 为啥要限流,相信就不用我多说...[详细]
-
想提高计算速度?作为数据科学家你应该知道这些Python多线程、进
每个数据科学项目迟早都会面临一个不可避免的挑战:速...[详细]
-
如《同样是高并发,QQ/微博/12306的架构难度一样吗?》...[详细]
-
两种实现方式分别是基于Ehcache和Redis的session管理...[详细]