比较运算符
大小比较:> < >= <=
相等比较:== != === !==
比较运算符的返回值类型:Boolean
console.log(6>5)//true
console.log(6<5)//false
算数运算符的优先级高于比较运算符
console.log(2+3>=5)//true,这里先计算了2+3=5,然后才进行比较
大小比较
两个字符串比较大小,比较的是字符串的字符编码。
在计算机中,每一个字符都有一个编码,计算机不能保存文字,只能保存纯数字,每一个文字都有一个对应的数字,所以当我们比较两个字符串时,计算机内部其实比较的是字符串对应的字符编码
console.log('A'>'B')//false ,这里比较的时候A对应的字符编码为65,而B对应的字符编码为66,所以结果返回false
console.log('AB'>'AC')//false,首先比较第一个字符,结果是相等的,然后比较第二个字符,C的字符编码是大于B的,所以结果为false
console.log('1'>'2')//false,1对应的字符编码为49,2对应的字符编码为50,所以结果为false
console.log('11'>'2')//false,字符串在进行大小比较的时候,先比较第一个字符,如果第一个字符相等,则继续向后面进行比较,如果第一个字符不相等,则直接返回比较结果,所以这里的结果仍然是false
console.log('11'>'1')//true,这里比较的时候第一个字符是相等的,会继续向后进行比较,而第二个字符串只有一个字符,那么js会认为其他位置为0,所以结果就返回了true
细节
1.如果一个不是字符串,并且两个都是原始类型,将他们都转换为数字进行比较
'1'-->1 ''-->0 ' '-->0 'A'-->NaN
console.log('1'>10);//false,将字符'1'转换为数字1再进行比较
console.log('2'>true);//true,只要一个不是字符串,一定是转换为数字再进行比较 2>1
2.NaN与任何数字进行比较,得到的结果都是false
console.log(NaN>0);//false
console.log(NaN<0);//false
console.log(NaN==0);//false
console.log(NaN>NaN);//false
console.log(NaN<Infinity);//false
console.log(NaN>-Infinity);//false
3.Infinity 比任何数字都大
-Infinity 比任何数字都小
console.log(Infinity>100000000000000);//true
console.log(Infinity>10n);//true
console.log(-Infinity<0);//true
console.log(-Infinity<-111111111111111111111111111);//true
4.如果其中一个是对象,将对象转换为原始类型,然后按照原始类型比较规则进行比较
目前,对象转换为原始类型后,是字符串"[object Object]"
console.log(3>{});//这里进行比较的时候因为有一个值不是原始类型,所以对象被转换成了字符串'[object Object]',现在就变成了一个比较数为数字,另一个为字符串,应用细节1的规则,两个比较数有一个不是字符串,那么都将被转换为数字,'[object Object]'转换为数字以后为NaN,所以结果就为false
console.log(null>-1);//true,两个原始类型进行比较并且有一个不是字符串,那么两者都会被转换为数字进行比较
console.log(undefined>-1);//false,undefined转换为数字是NaN
相等比较
相等比较 == 和 不相等比较 !=
== :比较两个数据是否相等
!= :比较两个数据是否不相等
细节
1.两端的类型相同,直接比较两个数据是否相同(两个对象比较的是地址)
var o1={}
var o2={}
console.log(o1==o2);//false,o1和o2指向两个不同的对象
2.两端的类型不同
1).null和undefined,他们之间相等,和其他原始类型比较,则不相等
console.log(null==undefined);//true
console.log(null=='');//false
console.log(undefined=='');//false
这里有个坑,比较null==0时返回false 但是null>=0 返回true null>0返回false,是不是感觉很神奇
console.log(null==0);//false
console.log(null>=0);//true
console.log(null>0);//false
但是undefined又有点不一样:
console.log(undefined==0);//false
console.log(undefined>0);//false
console.log(undefined>=0);//false
2).其他原始类型,比较时像转换为数字,再进行比较
console.log('1'==1)//true
console.log(true==1);//true
console.log(true=='1');//true
3).NaN与任何数字比较,都是false,包括自身
console.log(NaN==1);//false
console.log(NaN==NaN);//false
console.log(NaN==0);//false
4).Infinity和-Infinity,和自身相等
console.log(Infinity==Infinity);//true
console.log(Infinity==1);//false
console.log(-Infinity==-Infinity);//true
5).对象比较时,要先转换为原始类型,再进行比较
var o={}
console.log(o==0);//false,这里先将对象转换为原始类型,变成'object Object',然后再将其转换为数字NaN,结果为false
由于相等和不相等比较,对于不同类型的数据比较违反直觉,因此,通常我们不适用这种比较方法,而是使用更加接近只觉得严格相等和严格不相等来进行比较
===和!==(严格相等和严格不相等)
===:两端的数据和类型必须相同
!==:两端的数据或类型不相同
1.两端类型相同,规则和相等比较一致
2.两端类型不同,结果为false
数字规则:
1).NaN与任何数字比较,都是false,包括自身
2).Infinity和-Infinity,自身和自身相等
console.log(1===true);//false
console.log(NaN===NaN);//false
console.log(Infinity===Infinity);//true
console.log(-Infinity===-Infinity);//true
console.log(null===undefined);//false
网友评论