JavaScript 运算中,一共包含 4 个相等比较算法:抽象相等比较;严格相等比较;SameValueZero;SameValue。

作者:zhangbao90s

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

  • 抽象相等比较
  • 严格相等比较
  • SameValueZero
  • SameValue

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

参见下表:

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

  1. 是否会发生类型转换
  2. 对 NaN、-0、+0(即 0) 这些值是否存在特殊处理

下面给出一个总结:

就是说,抽象相等比较算法会发生类型转换,SameValue 算法不会特殊对待 NaN、-0、+0 这些值。

类型转换如何进行的?

上面讨论的四种算法中,只有“抽象相等比较算法”会发生类型转换。发生类型转换的前提是:比较的两个值类型不同,而且转换结果是数值。

举个例子:

 
  1. 1 == 1 // true(未发生类型转换)
  2. '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 之前,我们会遭遇这样的比较结果:

 
  1. NaN === NaN // false
  2. +0 === -0 // true
  3. [NaN].indexOf(NaN) // -1
  4. [0].indexOf(-0) // -1

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

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

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

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

就是说:

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

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

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期科技领域知识)

歌谣带你看java面试题

第九十六期:JavaScript 中的 4 个相等比较算法的介绍相关推荐

  1. 【移动战略说·第十六期】创业者面临的机遇与挑战(杭州站)

    经济高速发展的时代,消费者需求越来越高,创业政策的放宽,大量谋求改变命运的创业者涌入市场,创业早已不稀奇.但随着全民创业的趋势不断发展,创业市场竞争日趋激烈,创业似乎越来越难了.但即便如此,越来越多的 ...

  2. 【悟空云课堂】第二十六期:通过错误消息导致的信息暴露(CWE-209:Generation of Error Message Containing Sensitive Information)

    关注公众号"中科天齐软件安全中心"(id:woocoom),一起涨知识! 该栏目为中科天齐全新规划的悟空云课堂,每周五下午18:00准时上线,旨在科普软件安全相关知识,助力企业有效 ...

  3. 未雨绸缪,迎接运维新时代—— Tech Neo第十六期技术沙龙

    运维发展历程与工业革命异曲同工,工业的三次革命分别是机械化.电气化与信息化,运维则是原始手工.脚本与自动化工具.那么工业4.0悄然来临的今天,智能化又将会给运维带来哪些影响?坦白讲,AIOps是新概念 ...

  4. 鲁大师电动车智能化测评报告第十六期:破局者与搅局者之争

    鲁大师第十六期智能化电动车测评排行榜数据来源于鲁大师智慧实验室,测评的车型均为市面上主流品牌的主流车型.截止目前,鲁大师智能化电动车测评的车型高达80余种,且还在不断增加和丰富中. 1.测评依据 鲁大 ...

  5. android仿秒拍源码,你所不知道的程序员 程序员其实真的很…【Bus Weekly】三十六期...

    原标题:你所不知道的程序员 程序员其实真的很-[Bus Weekly]三十六期 快,点击蓝色"字体"关注这个公众号,一起涨姿势- 现如今,程序员在中国的科技 圈可以说已经达到了举足 ...

  6. Javascript第六章JavaScript中构造器创建对象第二课

    Javascript第六章JavaScript用new创建对象第一课 https://blog.csdn.net/qq_30225725/article/details/89304586 Javasc ...

  7. html5诗歌作业,《品味诗词群》总第七十六期作业

    <品味诗词群>总第七十六期作业 老物件总能给人以无限的怀想.本期作业以<收录机>为主题,以图题诗.韵部不限,诗词均可,要求不变,期待精彩! 品味诗词雅韵,传承华夏文明. 七绝 ...

  8. 第三十六期:学 Java 网络爬虫,需要哪些基础知识?

    说起网络爬虫,大家想起的估计都是 Python ,诚然爬虫已经是 Python 的代名词之一,相比 Java 来说就要逊色不少.有不少人都不知道 Java 可以做网络爬虫,其实 Java 也能做网络爬 ...

  9. 极乐技术周报(第十六期)

    2019独角兽企业重金招聘Python工程师标准>>> 几年前的真事,项目组 review 同事代码,notepad 打开 web.config 看数据库连接串,其中写着 " ...

最新文章

  1. 调剂女人身材的十种食物
  2. mysql整形溢出报错_MySQL整型数据溢出的解决方法
  3. 配置ADB到Windows环境变量
  4. C++覆盖和重载的区别
  5. TortoiseSVN 菜单详解
  6. spark sql中的窗口函数
  7. html树状图右侧_树状图及制作方法(Excel 2016/Excel 2013)
  8. 在Linux内核使用Kasan
  9. 微信小程序使用函数的方法
  10. Android开发小结Part2:目录
  11. 基于springboot的民办职业学校缴费系统
  12. 编译原理 编译器自动生成工具
  13. Win32 改变鼠标的光标图片
  14. Git更新本地分支信息
  15. 电路实验一阶电路误差分析_动态电路分析
  16. sqlserver2008已成功与服务器建立连接 但在登录过程中发生错误,指定的网络名不可再用(已解决)
  17. Mac新手必备技巧之如何关闭Mac屏幕亮度自动调节功能
  18. 计算机内存错误 要降频,win10系统出现内存自动降频的解决步骤
  19. python入门题库 赶紧来试试自己的水平吧
  20. 登录已失效,身份过期,该怎么办?

热门文章

  1. 如何解决Android SDK无法下载Package的问题(.net)
  2. HDU 4033 Regular Polygon(二分+高精度)
  3. linux增加端口失败,端口没被占用,怎么会bind失败呢?
  4. 英才计划计算机潜质测评试题,湖北省2020年“英才计划”潜质测试的通知
  5. linux bind命令,LINUX命令bind-系统管理-显示或设置键盘按键与其相关的功能
  6. 【51单片机快速入门指南】4.6:I2C 与 PCF8563实时时钟日历芯片
  7. 我为什么要立刻放弃 React 而使用 Vue?
  8. 【EWSA无线路由密码破解工具 中文特别版下载】含教程及字典(弱口令生日特殊符号等)
  9. [Linux] VIM 代码折叠
  10. vue-cookies使用方法,vue中使用获取cookie