从相等运算符的十步计算来看类型转换

JS 的隐式转换给咱们带来了很多便利,然而在一些时候,过分的使用也会致使一些不可预料的问题,好比 1 + '1' 的结果,这是一类常常要注意的简单问题。隐式转换属于类型转换的一部分,类型转换是一个简单而又繁杂的话题。这篇文章旨在理清楚其中的一个相关操做 相等运算符html

相等运算其中包括抽象相等(==)和严格相等(===),它们之间的区别仅在与,严格相等会直接比较类型,而不会作一些隐式转换。其实所谓的隐式转换,只是 EMCA 中规定的一些操做逻辑而已,今天,咱们就深刻其中,看看这层转换的外壳之下,究竟包含这什么。算法

相等运算符转换规则

比较 x == yxy 都是值,返回 true 或者 false。一个比较会执行以下步骤: 注: Type[x] 理解为 x 的类型。ToNumberToPrimitive 是类型转换中的一种处理,后面会提到。工具

  1. 若是 Type[x]Type[y] 的类型相同,那么执行严格相等比较。(因此说,能够理解为 ===== 的步骤之一)
  2. 若是 x 是 null 而且 y 是 undefined,那么返回 true。
  3. 若是 x 是 undefined 而且 y 是 undefined,那么返回 true。
  4. 若是 Type[x] 是 Number 而且 Type[y] 是 String,返回 x == !ToNumber(y) 的比较结果。
  5. 若是 Type[x] 是 String 而且 Type[y] 是 Number,返回 !ToNumber(x) == y 的比较结果。
  6. 若是 Type[x] 是 Boolean,返回 !ToNumber(x) == y 的比较结果。
  7. 若是 Type[y] 是 Boolean,返回 x == !ToNumber(y) 的比较结果。
  8. 若是 Type[x] 是 String,Number 或者 Symbol 而且 Type[y] 是 Object,返回 x == ToPrimitive[y] 的比较结果。
  9. 若是 Type[x] 是 Object而且 Type[y] 是 String,Number 或者 Symbol,返回 ToPrimitive[x] == y 的比较结果。
  10. 返回 false

化繁为简

上面的 10 条内容看起来头头是道,但是用来记忆就有诸多不便了。总结以下:ui

类型相同比较值,

nullundefined 总为 trueNumberString,ToNumber,

如有 Boolean 也 ToNumber。

Object 要 ToPrimitive,

其余结果返回 false复制代码

规则搞清楚之后,只须要弄明白 ToNumberToPrimitive 是什么就万事大吉了。咱们先从简单的提及,spa

ToNumber 的规则,官方给出一个表格:code

参数类型 结果
Undefined 返回 NaN
Null 返回 +0
Boolean 若是 argument 是 true,返回 1,不然返回 0
Number 返回 argument 没有转换
String 参考下面的转换算法
Symbol 抛出类型错误
Object 两步走:
1. 转换成基本值, ToPrimitive(argument, hint Number)
2. 返回 ToNumber()

好了,到此为止,彷佛对 Obejct 的比较运算处理起来须要多一步先转换为数字(也只能这样),再跟具体 ToNumber 比较,由此咱们能够进一步推测,在处理字符串,布尔值等基本数据类型的时候,应该会有 ToBoolean 或者 ToString 等等的内置工具(实际上类型转换的规则更多具体,ECMA 中有很详细的介绍)。这里要挖个坑,关于上图表格中的字符串转换算法,我有点看不懂 ECMA 中的介绍,须要继续研究。cdn

关于 ToPrimitive 的内容也很简单,断言处理输入值,而后根据输入类型作不一样处理获得基本值。htm

参考资料

  1. Abstract Equality Comparison

pic
相关文章
相关标签/搜索