首先看以下问题,后边我会逐一讲解并总结。肯定可以让你记住。
"1" == 1; // ?
1 == "1"; // ?
0 == false; // ?
0 == null; // ?
0 == undefined; // ?
0 == !!null; // ?
0 == !!undefined; // ?
null == undefined; // ?
const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3; // ?
number1 == number2; // ?
解析
首先双等于操作符的让人产生困扰的万恶之源就是自动类型转换。
比如观察最后一个number1 == number2;
二者都是Number
类型的,不存在数据类型转换,而且二者是引用类型,即二者的内存地址是不一致的。故最后这个是false。
而倒数第二个number1 == 3
这是不同类型的比较,存在数据类型转换。但凡是对象与基本数据类型的比较。都是对象调用自身的valueOf/toString,进而转换为基本数据类型后再进行比较。而number1.valueOf()
的值就是3
。故倒数第二个为true。
怎么样是不是有些感觉了。总之不同类型的比较按照以下规则去转换。就可以容易的推断出结果了
- 字符串与数字类型比较,字符串会尝试转换为数字后进行比较
- 布尔类型与不同类型的比较,布尔类型会转换为 数组类型
0 1
后再进行比较 null==undefined
,此外二者不再等于任何基本数据类型
通过以上的规则是不是你已经对文章开头的问题有答案了?
答案
"1" == 1; // true
1 == "1"; // true
0 == false; // true
0 == null; // false
0 == undefined; // false
0 == !!null; // true
0 == !!undefined; // true
null == undefined; // true
const number1 = new Number(3);
const number2 = new Number(3);
number1 == 3; // true
number1 == number2; // false
其实MDN的官方文档中还有一些细节。但整体是这样的,可以点击下面的链接去参考。
参考: MDN足够官方,并且很容易懂。