刚接触js不久的时候,看了js高程那本书,当时对里面的很多知识的了解都是处于一个“知道有这个东西”的程度,随着后面接触的稍微多一些的时候,遇到的问题也多了,就发现有些东西自己并没有理解透彻,需要再次理解巩固,而且温故知新嘛。
以前对js的==判断的理解就是:如果两边的操作数类型一致,则直接比较值相不相等;如果两边操作数类型不一致,则先对操作数进行类型转换再比较。
但是后面发现好像这样推出来的结果有时候与实际输出的结果并不一致。比如:
console.log(null == 0);//false
如果先做类型转换的话,Number(null);
应该会先转换成0,怎么会返回false呢?
后来去搜索js的==到底是怎么判断的,才明白了,这里把它记下来:
描述:相等运算符用于比较两个值,返回true或false;
算法:
1、如果x不是正常值(比如抛出一个错误),中断执行。
2、如果y不是正常值,中断执行。
3、如果Type(x)与Type(y)相同,执行严格相等运算x === y。
4、如果x是null,y是undefined,返回true。
5、如果x是undefined,y是null,返回true。
6、如果Type(x)是数值,Type(y)是字符串,返回x == ToNumber(y)的结果。
7、如果Type(x)是字符串,Type(y)是数值,返回ToNumber(x) == y的结果。
8、如果Type(x)是布尔值,返回ToNumber(x) == y的结果。
9、如果Type(y)是布尔值,返回x == ToNumber(y)的结果。
10、如果Type(x)是字符串或数值或Symbol值,Type(y)是对象,返回x == ToPrimitive(y)的结果。
11、如果Type(x)是对象,Type(y)是字符串或数值或Symbol值,返回ToPrimitive(x) == y的结果。
12、返回false。
由于0的类型是数值,null的类型是Null(这是规格4.3.13小节的规定,是内部Type运算的结果,跟typeof运算符无关)。因此上面的前11步都得不到结果,要到第12步才能得到false。
所以有console.log(null == 0);//false
有人说要比较相等性之前,不能将null和undefined转换成其他任何值。就是undefined和null与其他数在进行相等判断时不进行类型转换。