文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript中的4 个相等比较算法的简单介绍

2024-04-02 19:55

关注

这篇文章主要讲解了“JavaScript中的4 个相等比较算法的简单介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中的4 个相等比较算法的简单介绍”吧!

JavaScript 运算中,一共包含 4 个相等比较算法:

可以这么说,只要你做过相等比较,你就在使用四个算法中的一个。因为这些算法部署在了涉及到相等比较的操作符或方法中。

参见下表:

JavaScript中的4 个相等比较算法的简单介绍

怎样区分这些算法的不同呢,可以从两方面切入:

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2. 是否会发生类型转换

  3. 对 NaN、-0、+0(即 0) 这些值是否存在特殊处理

下面给出一个总结:

JavaScript中的4 个相等比较算法的简单介绍

就是说,抽象相等比较算法会发生类型转换,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,两者不等)。

JavaScript中的4 个相等比较算法的简单介绍

规范中对抽象相等比较算法搞了一个“小怪癖”:定义 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) // -1

NaN 与自身不相等,+0 等于 -0。在意识中,我们可能接受不了“NaN 与自身不相等”的结果,但是能够理解“+0 等于 -0”(都是 0  嘛),但是在某些符号位具有含义的场景中——- 表示向左,+ 表示向右,那么区分 +0 等于 -0 就有意义了。

基于此,ES2015 中引入了 SameValue 算法,Object.is() 方法内部就是使用此算法,比较两个值是否相等。

Object.is(NaN, NaN) // true Object.is(0, -0) // false

SameValueZero 算法,通过名称我们可能就猜到,与 SameValue 算法的区别,仅仅是对“零”的态度上——SameValueZero  算法不能区分 +0 和 -0。

就是说:

var array = [NaN, -0] array.includes(NaN) // true array.includes(0) // true

array.includes(0) 的结果没有返回 false,是因为其内部使用的 SameValueZero 算法不能区分 +0 和 -0。

感谢各位的阅读,以上就是“JavaScript中的4 个相等比较算法的简单介绍”的内容了,经过本文的学习后,相信大家对JavaScript中的4 个相等比较算法的简单介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯