javascript 基础小炒-关于“==”

203 阅读2分钟

本文主要侃侃js中双等号“==”。

概述

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

先举些例子

  1. null == undefined

解析:If x is null and y is undefined, return true."=="两边是null或者undefined,返回true
  1. [] == 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
  1. true=='true'

解析:同上个例子 => 1=='true';
然后,1==ToNumber('true') => 1==NaN
返回false
  1. {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规范,了解了,明白了也便记住了。有事没事多看看。

ES5规范

ES6规范

javascript MDN规范