实例分析JS中的相等性判断===、 ==和Object.is()
相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能答对几个?
NaN===NaN//false NaN==NaN//false Object.is(NaN,NaN)//true 0==false//true 1==true//true Number(null)===0//true null==0//false
Javascript提供了三种不同的值比较操作,分别是严格相等、宽松相等、以及Object.is,希望看完下面的内容,能够彻底弄清楚他的判断逻辑。
1.严格相等x===y判断逻辑
1、如果x的数据类型和y的数据类型不相同,返回false;
2、如果x是Number类型
- x是NaN,返回false
- y是NaN,返回false
- x的值和y的值相等,返回true
- x是+0,y是-0,返回true
- x是-0,y是+0,返回true
- 否则返回false
3、其他类型参照SameValueNonNumber(x,y)
- 断言:x,y不是Number类型;
- 断言:x,y的数据类型相同;
- x是undefined,y是undefinedreturntrue;
- x是null,y是null,returntrue;
- x是字符串类型,当且仅当x,y字符序列完全相同时(长度相同,每个位置上的字符也相同)返回true,否则返回false;
- 如果x是布尔类型,当x,y都为true或者都为false时返回true,否则返回false;
- 如果x是symbol类型,当x,y是相同的symbol值,返回true,否则返回false;
- 如果x,y是同一个对象值,返回true,否则返回false;
NaN===NaN//false undefined===undefined//true null===null//true undefined===null//false
2.宽松相等x==y
- 如果x,y的类型相同,返回x===y的结果;
- 如果x是null,y是undefined,返回true;
- 如果x是undefined,y是null,返回true;
- 如果x是数值,y是字符串,返回x==ToNumber(y);
- 如果x是字符串,y是数值,返回ToNumber(x)==y;
- 如果x是布尔类型,返回ToNumber(x)==y的结果;
- 如果y是布尔类型,返回x==ToNumber(y)的结果;
- 如果x是String或Number或Symbol中的一种并且Type(y)是Object,返回x==ToPrimitive(y)的结果
- 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回ToPrimitive(x)==y的结果
- 其他返回false
12=='0xc'//true,0xc是16进制 12=='12'//true 12=='12c'//false,说明ToNumber转换是用的Number()方法
注意:
Number(null)===0 但是 null==0//false,
2.1ToNumber将一个值转换为数值类型
详情参考数值类型转换
- 如果是boolean类型,true返回1,false返回0;
- 如果是数值,只是简单的传入返回;
- 如果是null,返回0
- 如果是undefined,返回NaN;
- 如果是字符串,字符串如果只包含数字,则将其转换成十进制数;如果是有效的浮点格式,将其转换成对应的浮点数值;如果是二进制或十六进制将其转换成对应的十进制数值;
- 如果是对象,调用对象的valueOf()方法,然后依照前面规则转换,如果valueOf返回值是NaN,则调用toString()方法,再依照前面的规则转换返回的字符串
2.2ToPrimitive
toPrimitive(A)通过尝试调用A的A.toString()和A.valueOf()方法,将参数A转换为原始值(Primitive);
JS中原始类型有:Number、String、Boolean、Null、Undefined;
不同类型对象的valueOf()方法的返回值:
对象 | 返回值 |
---|---|
Array | 返回数组对象本身。 |
Boolean | 布尔值 |
Date | 存储的时间是从1970年1月1日午夜开始计的毫秒数UTC |
Function | 函数本身 |
Number | 数字值 |
Object | 对象本身。这是默认情况,可以覆盖自定义对象的valueOf方法 |
String | 字符串值 |
//Array:返回数组对象本身 vararray=["ABC",true,12,-5]; console.log(array.valueOf()===array);//true //Date:当前时间距1970年1月1日午夜的毫秒数 vardate=newDate(2013,7,18,23,11,59,230); console.log(date.valueOf());//1376838719230 //Number:返回数字值 varnum=15.26540; console.log(num.valueOf());//15.2654 //布尔:返回布尔值true或false varbool=true; console.log(bool.valueOf()===bool);//true //new一个Boolean对象 varnewBool=newBoolean(true); //valueOf()返回的是true,两者的值相等 console.log(newBool.valueOf()==newBool);//true //但是不全等,两者类型不相等,前者是boolean类型,后者是object类型 console.log(newBool.valueOf()===newBool);//false //Function:返回函数本身 functionfoo(){} console.log(foo.valueOf()===foo);//true varfoo2=newFunction("x","y","returnx+y;"); console.log(foo2.valueOf()); /* ƒanonymous(x,y ){ returnx+y; } */ //Object:返回对象本身 varobj={name:"张三",age:18}; console.log(obj.valueOf()===obj);//true //String:返回字符串值 varstr="http://www.xyz.com"; console.log(str.valueOf()===str);//true //new一个字符串对象 varstr2=newString("http://www.xyz.com"); //两者的值相等,但不全等,因为类型不同,前者为string类型,后者为object类型 console.log(str2.valueOf()===str2);//false
3.同值相等
同值相等由Object.is方法判断:
- 两个值都是undefined
- 两个值都是null
- 两个值都是true或者都是false
- 两个值是由相同个数的字符按照相同的顺序组成的字符串
- 两个值指向同一个对象
- 两个值都是数字并且
- 都是正零+0,
- 或者都是负零-0,
- 或者都是NaN
- 都是除零和NaN外的其它同一个数字
Object.is('foo','foo');//true Object.is(window,window);//true Object.is('foo','bar');//false Object.is([],[]);//false varfoo={a:1}; varbar={a:1}; Object.is(foo,foo);//true Object.is(foo,bar);//false Object.is(null,null);//true Object.is(true,'true')//false //特例 Object.is(0,-0);//false Object.is(0,+0);//true Object.is(-0,-0);//true Object.is(NaN,0/0);//true
4.零值相等
与同值相等类似,不过会认为+0与-0相等。
小结
===不做类型转换,当两边的数类型不相同时,直接返回false;当前类型相同且都是数值类型的时候,有一个是NaN,那么结果就是false,另外+0===-0
==运算符,当两边操作数类不相同时会做隐式转换,然后才进行比较,这样的话就会出现false==0,‘'==false等现象,但是Object.is不会做这种转换
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。