以前在学习JavaScript时总是有些漏洞,比如JavaScript中两个等号的比较所带来的类型转换问题,今天特别拿出来研究整理了一下。
对象==对象
引用类型的数据比较的是引用地址
1 | {}=={}; //false,引用地址不同 |
对象==字符串
对象通过toString()转换成字符串
1 | [].toString(); //'' |
对象==数字
对象先通过toString()转换成字符串,字符串再通过Number()转换成数字
1 | [1]==1; //true [1]=>'1','1'=>1 |
对象==布尔
左右两边先统一转换成数字类型再进行比较
1 | []==true; //false []=>0,true=>1 |
字符串==数字
把字符串转换成数字再进行比较
1 | 'abc'==NaN; //false 'abc'=>NaN NaN和NaN不相等 |
字符串==布尔
左右两边先转化成数字再比较
1 | '1'==true; //true '1'=>1,true=>1 |
数字==布尔
布尔类型转换成数类型再进行比较
1 | true==3; //false true=>1 |
NaN==NaN
NaN和任何数(包括自己)比较时都返回false
1 | NaN==NaN; //false |
null==undefined
左右两边不做数据类型转换,返回结果为true
1 | null==undefined; //true |
null和undefined没有toString()方法,和任何数去比较,返回结果都为false。和自身比较返回true。
1 | null==false; //false |
按照我的想法,两个等号比较,大致上类型转换的思路是:
- 对象和对象间比较引用地址
- 对象和三种基本数据类型转换,先转换成字符串,如果需要则继续转换则数字
- 三种基本数据类型转换成数字再进行比较
- null和undefined和除了自身任何数比较都为false
- NaN任何时候比较都返回false
JavaScript中的这种隐式数据类型转换,有些时候确实会带来一些问题。为了减少这些问题对代码产生影响,我决定尽量少用相等,多用全等以便去更好的控制数据类型。