手机端网站建设教程视频,网站做内嵌,搜索引擎营销有哪些方式,淘宝运营培训内容JavaScript 运算中#xff0c;一共包含 4 个相等比较算法#xff1a;抽象相等比较#xff1b;严格相等比较#xff1b;SameValueZero#xff1b;SameValue。
作者#xff1a;zhangbao90s JavaScript 运算中#xff0c;一共包含 4 个相等比较算法#xff1a;
抽象相等…JavaScript 运算中一共包含 4 个相等比较算法抽象相等比较严格相等比较SameValueZeroSameValue。
作者zhangbao90s JavaScript 运算中一共包含 4 个相等比较算法
抽象相等比较严格相等比较SameValueZeroSameValue
可以这么说只要你做过相等比较你就在使用四个算法中的一个。因为这些算法部署在了涉及到相等比较的操作符或方法中。
参见下表 怎样区分这些算法的不同呢可以从两方面切入
是否会发生类型转换对 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 转为 0undefined 转为 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) // -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。
阅读目录置顶)(长期更新计算机领域知识
阅读目录置顶)(长期更新计算机领域知识
阅读目录置顶)(长期科技领域知识
歌谣带你看java面试题