Js相等操作符
对于有其他编程语言编程经验的人来说,在判断两个值是否相等时,会用“==”,但是此方法用于Js,特别是用Webstorm等前端IDE编写Js程序时,会发现此方法会报错,并提示应该更改为“===”,这到底是怎么回事,下面我们就来区别一下Js这两个相等操作符——“==”和“===”
总的一句:==不管类型相不相同,只要进行转化后条件符合(具体怎么转化请往下看),就会判定为相等;===必须比较的两个值类型和值相等时才相等,即===要比==严格。
“===”
先说简单的,===。
用于比较的两个值,类型不相等则不相等,类型相等且值相等,则相等。
例子
例一:
1 | console.log('test'===true); //结果为:false,以为类型不相等,一个字符串一个布尔值 |
值得注意的一点是,关于对象,就算是分别定义的两个对象的内容一样,用’===’进行比较也是不相等的,因为存储的位置不同,除非是用引用的方式将一个对象的值赋给另一个对象,这才返回true。(什么是对象的引用可以看这篇文章:对象引用问题上Java和Js是相通的–Java入门)
例二:
1 | var person1={a:'xiao'}; |
“==”
null与undefined在与其他数相等运算时步进行类型转换
使用==时,不同类型的值也可以被看做相等,不过Js会对其进行一定的转化后再惊醒比较,下面来看看如果对不同类型的值使用“==”进行比较,Js会进行怎样的转化:

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

toPrimitive

例子
例一:
1 | console.log('test'?true:false);//结果为:true |
原因:这里是判断test字符串变成布尔值后是什么,因为字符串的长度大于一。这里涉及到Js中true和false的问题,稍微说下Js中true和false是怎么转换的:

例二:
1 | console.log('test'==true); //结果为:false |
原因:进行比较的时候,布尔值true被toNumber变成数字1;而字符串test则被toNumber转换成NaN,进而表达式转换成判断NaN==1,结果自然为false。
例三:
1 | console.log('test'==false); //结果为:false |
原因:同例二一样的道理,结果表达式被转换成判断NaN==0,结果仍然为false。