相等操作符的那些事儿

先说结论,==相等操作符会进行隐式转换再比较有可能造成结果的不可预测,所以开发时候更建议使用===全等操作符来做比较。
但是,相等操作符的操作比较也是面试的热门考点之一,这里就稍作总结。

相等操作符号比较转换图

conversion

可以得出以下就条容易记忆的点:

  1. 同类型比较,直接比较内容。
  2. undefined,null,Objectr以外,Number,String,Boolean之间的比较皆先通过ToNumber(value)转换为Number类型再比较。
  3. 除自身以外,undefined 只会和 null 相等,反之亦然。
  4. Object参与比较的时候会转换为原始值(Primitive)再进行比较,ToPrimitive 会先调用对象的valueOf()方法,如果不存在就会再调用toString()方法,然后把拿到的值再进行比较。如果toString()valueOf()都不存在,就会报TypeError
  5. Symbol()类型不与任何值相等。

一些关于数据类型的细节

  • 为什么有的编程规范要求用 void 0 代替 undefined?
    • 因为在{ ... }局部代码块中,undefined是允许被赋值的,所以使用void 0更稳妥。
  • 为什么0.1 + 0.2 != 0.3
    • 这个是老生常谈的问题了,原因在于IEEE-754的双精度浮点数规则,0.1存储成二进制的时候是无限循环二进制导致了。解决的方法可以:
1
2
3
4
5
(0.1 + 0.2).toPrecision(10) == 0.3
> true

(0.1 + 0.2).toFixed(10) == 0.3
> true