最近在看js犀牛书巩固js的基础知识,突然感觉打开了新世界的大门。看到相等运算符(==)与严格相等运算符也叫恒等运算符(===)这一块时,觉得以前对这两个的了解真的是知之甚少。所以决定写篇文档,一方面可以在日后回顾,另一方面也希望有更多入坑的同学看到,能够对js的提升有所帮助。
先来说下严格相等运算(既===)有哪些特性(区别特性在一下代码片段中详解)
//1,如果两个值类型不同,则他们不相等,代码如下
console.log(1==='1');//此结果显而易见为false(此处注意下边讲解相等运算时,结果为true)
//2,如果两个值都是null或都是undefined,则不相等
console.log(null===undefined)//结果为false,(此处注意下边讲解相等运算时,结果为true)
//3,如果相比较的两个值其中一个为NaN,或者两个值都为NaN,则他们不相等(注:NaN和其他任何值都不相等,包括它本身)
console.log(NaN===NaN,1===NaN,'1'===NaN)//false,false,false,我们可以通过x!==x来判断是否为NaN(似乎也是一道面试题)
//4,如果两个引用值指向同一对象,数组或函数则他们相等,否则,即便是两个对象具有相同的属性也不相等
var a={name:'小明'};
var b=a;
var c={name:'小明'};
console.log(a===b,a===c);//true,false
//5,如果两个值为字符串,他们的长度,内容且编码相等则他们相等,否则不等
console.log('aa a'==='aaa','aaa'==='\u0061\u0061\u0061');//false,true
//6,如果两个值都是布尔值true或false,则二者相等
console.log(true===true)//true
接下来说相等运算符,相等运算符和严格相等运算符类似,但相比较而言,相等运算符(==)比较起来不严格,如果相比较的两个值类型不同,他们也有可能相等。接下来的比较可能会有些出人意料,我们来看代码:
//1,如果一个值为null,一个值为undefined,则两者相等(因为Null和undefined都表示没有值)
console.log(null==undefined,null===undefined)//true,false
//2,如果一个值为数字,另外一个为字符串,则先将字符串转换为数字在进行比较
console.log(1=='1')//true
//3,如果其中一个值为true,先将true转为1在进行比较,如果为false则先转为0再进行比较
console.log(true==1,false==0,true=='1');//true,true,true
/*此处第三个true=='1',也为true,原因是将true转为数字1与字符串1比较,然后字符串1被转换为数字与1进行比较
注:字符串与数字进行比较,会先将字符串做一次隐式类型转换,转为number类型。
*/
//4,如果一个值是对象,另外一个值为字符串或数字,则先将对象转为原始值,在进行比较。
//注:js会首先使用valueof,在尝试使用toString()将对象转为原始值(可在js权威指南3.8.3中讲解如何转换,以及转换过程)
console.log({a:1}=='[object Object]')//true
最后,总结一下,使用相等运算符(既==)进行比较时,字符串与谁比较,会将字符串转为数字在进行比较,在与布尔值进行比较时,会先将布尔值转为数字在进行比较。
在日常使用中,还是推荐使用严格相等进行比较,以免出现不必要的麻烦