关于”==” 和 “===”的总结:
“===”叫做严格运算符,”==”叫做相等运算符。
严格运算符的运算规则如下:
1、如果类型不同,就[不相等]
2、如果两个都是数值,并且是同一个值,那么[相等];如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
3、如果两个都是字符串,每个位置的字符都一样,那么[相等];否则[不相等]。
4、如果两个值都是true,或者都是false,那么[相等]。
5、如果两个值都引用同一个对象或函数,那么[相等];否则[不相等]。
6、如果两个值都是null,或者都是undefined,那么[相等]。
相等运算符的运算规则如下:
1、如果两个值类型相同,进行 === 比较。
2、如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
(1)如果一个是null、一个是undefined,那么[相等]。
(2)如果任一值是字符串,另一个值是数值,在比较相等性之前先将字符串转换为数值;即是调用Number()函数。
(3)如果任一值时布尔值,则在比较相等性之前先将其转换为数值,即是调用Number()函数。
(4)如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString;例外的是Date,Date利用的是toString转换。
再次分析 [ ] == ![ ]这道题:
(1)看见 ![ ]这个是要对空数组转成布尔类型结果得到![ ] = false,(2)发现此时符合第三条,如果任一值是布尔类型是需要将其转换为数值,即Number(false),结果为 Number(false) = 0。(3)此时得到 [ ] == 0比较,此时符合第四条
即 [ ].toString();结果为[].toString() = ” ”;(4)此时得到 ” ” == 0,发现符合第二条即Number(“”);
结果为Number(” ”) = 0;(5)此时得到 0 == 0 两个同时为数值类型比较所以结果为true;
You Don’t Know JS的作者关于”==”和”===”,在第一本书的第二章是这样说的:许多开发者认为 === 的行为更加容易预测,所以他们总是主张使用 === 而劝人们远离 ==,我认为这种看法是非常短视的。如果你花点时间来搞清楚它是如何工作的话,== 绝对是一个能够帮助你程序的强大工具。
但也有的人这样说:团队协作中肯定需要读别人的代码。而当你看到“==”时,要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,还是不应该转型但是写错了……所花费的脑力和时间比明确的“===”(加上可能需要的明确转型)要多得多。要记得团队中的每个人(包括原作者自己)都需要付出这理解和维护成本。
无法判定哪种方式是正确的,也没有办法要求所有人都有同一样的理解方式,所以必须要明白严格运算符和相等运算符的区别以及底层的转换原理,以后再碰到项目中的相关问题就能更好的理解作者的意图。
来源见图片水印