对于有其他编程语言编程经验的人来说,在判断两个值是否相等时,会用“==”,但是此方法用于Js,特别是用Webstorm等前端IDE编写Js程序时,会发现此方法会报错,并提示应该更改为“===”,这到底是怎么回事,下面我们就来区别一下Js这两个相等操作符——“==”和“===”

总的一句:==不管类型相不相同,只要进行转化后条件符合(具体怎么转化请往下看),就会判定为相等;===必须比较的两个值类型和值相等时才相等,即===要比==严格。

“===”

先说简单的,===。

用于比较的两个值,类型不相等则不相等,类型相等且值相等,则相等。

例子

例一:

1
2
console.log('test'===true);	//结果为:false,以为类型不相等,一个字符串一个布尔值
console.log('test'==='test'); //结果为:true,因为类型相等且值相等

值得注意的一点是,关于对象,就算是分别定义的两个对象的内容一样,用’===’进行比较也是不相等的,因为存储的位置不同,除非是用引用的方式将一个对象的值赋给另一个对象,这才返回true。(什么是对象的引用可以看这篇文章:对象引用问题上Java和Js是相通的–Java入门

例二:

1
2
3
4
5
6
7
8
9
var person1={a:'xiao'};
var person2={a:'xiao'};
console.log(person1===person2);
//结果为:false,因为person1和person2的存储位置不一样,所以是不同的对象

var person1={a:'xiao'};
var person2=person1;
console.log(person1===person2);
//结果为:true,因为person2是对person1的引用,它们指向的是用一个内存块,所以相等

“==”

null与undefined在与其他数相等运算时步进行类型转换

使用==时,不同类型的值也可以被看做相等,不过Js会对其进行一定的转化后再惊醒比较,下面来看看如果对不同类型的值使用“==”进行比较,Js会进行怎样的转化:

mark

若x和y类型相同,Js会比较它们的值或者对向值。如果不同,则按上面的形式进行转化后再比较。其他没有列在表格中的情况都会返回false。

toNumber和toPrimitive的转化结果

toNumber

mark

toPrimitive

mark

例子

例一:

1
console.log('test'?true:false);//结果为:true

原因:这里是判断test字符串变成布尔值后是什么,因为字符串的长度大于一。这里涉及到Js中true和false的问题,稍微说下Js中true和false是怎么转换的:

mark

例二:

1
console.log('test'==true);	//结果为:false

原因:进行比较的时候,布尔值true被toNumber变成数字1;而字符串test则被toNumber转换成NaN,进而表达式转换成判断NaN==1,结果自然为false。

例三:

1
console.log('test'==false);	//结果为:false

原因:同例二一样的道理,结果表达式被转换成判断NaN==0,结果仍然为false。