本文主要侃侃js中双等号“==”。
概述
一般来说,js中能使用“===”就不要使用“==”,why?因为js是弱类型语言,判断相等时既要判断类型是否一致又要判断值是否相等;而如果使用了“==”,js会产生类型的隐式转换,而这个转换是我们不可控的,是ES规范中规定好的,因此,往大了讲,“==”不是不可用,只要你确信可以把这个规范理解的足够到位,that's all!
先举些例子
- null == undefined

解析:If x is null and y is undefined, return true."=="两边是null或者undefined,返回true
- [] == true

解析:If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
首先,[]==ToNumber(true) => []==1;
然后,If Type(x) is either String, Number, or Symbol and Type(y) is Object, then
return the result of the comparison x == ToPrimitive(y) ,ToPrimitive([])==1 => ''==1;
最后,If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y.
ToNumber('')==1 => 0==1 返回false
- true=='true'

解析:同上个例子 => 1=='true';
然后,1==ToNumber('true') => 1==NaN
返回false
- {a:1} == {a:1}

解析:根据规范 直接返回false
规范是什么?

大致翻译如下(从第三条开始):
3、如果两边类型相同,那么直接使用“===”比较值即可。
4和5、如果两边为null或者undefined,返回true;
6和7、string类型和number类型比较,把string类型转换成number类型再比较;
8和9、等号一边有boolean类型,先把boolean类型转换成数字类型再比较,也就是把boolean转换成1或者0;
10和11、Object类型(Array、Function等)和string、number、symbol类型比较,首先把Object转换成原始值再比较。Object转换成原始值怎么理解?javascript MDN中是这么说的,

12、其他情况,均返回false。这也是上面第4个例子直接返回false的原因。
感悟
学东西还得往祖坟上刨,便于我们理解的透彻、记忆深刻,运用起来得心应手。如同上面的ES规范,了解了,明白了也便记住了。有事没事多看看。