Ryan Shang

生死看淡,不服就干

0%

JS中两个等号的比较

​ 以前在学习JavaScript时总是有些漏洞,比如JavaScript中两个等号的比较所带来的类型转换问题,今天特别拿出来研究整理了一下。

对象==对象

引用类型的数据比较的是引用地址

1
2
{}=={}; //false,引用地址不同
[]==[]; //false,引用地址不同

对象==字符串

对象通过toString()转换成字符串

1
2
3
4
[].toString(); //''
({}).toString(); //[Object Object]
[]==''; //true
({})=='abc'; //false

对象==数字

对象先通过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

​ 按照我的想法,两个等号比较,大致上类型转换的思路是:

  1. 对象和对象间比较引用地址
  2. 对象和三种基本数据类型转换,先转换成字符串,如果需要则继续转换则数字
  3. 三种基本数据类型转换成数字再进行比较
  4. null和undefined和除了自身任何数比较都为false
  5. NaN任何时候比较都返回false

​ JavaScript中的这种隐式数据类型转换,有些时候确实会带来一些问题。为了减少这些问题对代码产生影响,我决定尽量少用相等,多用全等以便去更好的控制数据类型。