0%

宽松相等和严格相等

区别:

==允许在相等比较中做强制类型转换而===不允许

1
2
3
4
var a=42;
var b="42";
a===b;//false;
a==b;//true

ES5中定义:

  1. 如果Type(x)是数字,Type(y)是字符串,则返回x==ToNumber(y)的结果
  2. 如果Type(x)是字符串,Type(y)是数字,则返回ToNumber(x)==y的结果

其他类型和布尔类型之间的相等比较

1
2
3
4
var a='42';
var b=true;
a==b;//false
//ToNumber()将b转为1,变成'42'==1,又把'42'转为42就出现不相等

规范:

1.如果Type(x)是布尔类型,则返回ToNumber(x)==y的结果

2.如果Type(y)是布尔类型,则返回x==ToNumber(y)的结果

这个结果是错误的,因为’42‘本身是真值,要避免==true,==false

1
2
3
4
5
6
var a='42';
//不要这样用,不成立
if(a==true)
if(a)
if(!!a)
if(Boolean(a))

null和undefined之间的相等比较

规范:

  1. 如果x为null,y为undefined,则结果为true
  2. 如果x为undefined,y为null,则结果为true

因此判断a是否是null或者undefined时直接判断a==null即可

对象和非对象的相等比较

规范:

  1. 如果Type(x)是字符串或者数字,Type(y)是对象,则返回x==ToPrimitive(y)的结果
  2. 如果Type(x)是对象,Type(y)是字符串或数字,则返回ToPrimitive(x)==y的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var a=42;
var b=[42];
a==b;//true,变成42=='42'=>42==42
var a="abc";
var b=Object(a);
a===b;//false
a==b;//true,b通过ToPrimitive强制类型转换为"abc"
//没有对应封装对象,null和undefined不能被封装,下面返回false
var a==null;
var b=Object(a);
a==b;//false
var a=undefined;
var b=Object(a);
a==b;//false
var a=NAN;
var b=Object(a);
a==b;//false,因为NAN==NAN本身是false