参考:值的比较
在看完这一节内容后,算是做一个总结工作:
值的比较
首先,数学中的很多比较运算符,在JavaScript中如下:
- 大于 / 小于:a > b,a < b。
- 大于等于 / 小于等于:a >= b,a <= b。
- 检查两个值的相等:a == b,请注意双等号 == 表示相等性检查,而单等号 a = b 表示赋值。
- 检查两个值不相等:不相等在数学中的符号是 ≠,但在 JavaScript 中写成 a != b。
值的比较的结果一定都是Boolean类型的
所有比较运算符均返回布尔值:
- true;
- false;
和其他类型的值一样,比较的结果可以被赋值给任意变量:
比较时符号两边类型不一样,比较规则不一样
两边都是数字:
比如下面这种:
比较的规则就按照数字的大小来比较。
两边都是字符串时:
字符型的字符串
按照首位字符的大小来比,首位字符大的就大,首位字符相等,接着比较下一个字符。
每一个字符比较时是按照字符的Unicode编码顺序比较的。
比如'Z'>'A'
:
'Z':
Unicode编码:U+005A [后面是四个16进制位]
’A’:
Unicode编码: U+0041
005A > 0041按照位置比较就行,或者你转为10进制来比较。
数字类型的字符串:
alert('3'>'12'); //true
这里首位首先比较,'3'
与 '1'
进行比较,都是字符串,目前我也不清楚是不是直接按照数字3和1比较,因为在unicode中没有找到字符3,只有数字3。
或者按照我们自己的理解,单个的字母越往后就越大,数字类型的字符呢,3肯定是大于1.
两边的类型不相同
不相同的类型比较时,还需要看比较的时候存不存在null
和undefined
这两个特殊类型:
当不存在null和undefined这两个特殊类型时:
比较会把两边都转为数字类型,再进行比较:
alert( '2' > 1 ); // true,字符串 '2' 会被转化为数字 2
alert( '01' == 1 ); // true,字符串 '01' 会被转化为数字 1
alert( true == 1 ); // true 转为数字1
alert( false == 0 ); // true 转为数字0
当存在null和undefined这两个特殊类型时:
当使用非严格相等 == 比较二者时。
JavaScript 存在一个特殊的规则,会判定它们相等。它们俩就像“一对恋人”,仅仅等于对方而不等于其他任何的值(只在非严格相等下成立)。
//在含有null和undefined时,相等性检查,她两只能互相相等,不等于其他任何东西
alert( null == undefined ); // true
alert( null == 0 ); // (2) false
alert( undefined == 0 ); // false (3)
//相等性检查时,只有彼此互相相等。
当使用数学式或其他比较方法 < > <= >= 时:
null/undefined 会被转化为数字:null 被转化为 0,undefined 被转化为 NaN。
//进行其他方式比较,null被转为0,
alert( null > 0 ); // false
alert( null >= 0 ); // true
//但是进行相等性比较时,null只等于undefined,
alert( null == 0 ); // false
undefined 不应该被与其他值进行比较:
//undefined 在比较中被转换为了 NaN,而 NaN 是一个特殊的数值型值,它与任何值进行比较都会返回 false。
alert( undefined > 0 ); // false (1)
alert( undefined < 0 ); // false (2)
//返回 false 是因为这是一个相等性检查,而 undefined 只与 null 相等,不会与其他值相等
alert( undefined == 0 ); // false (3)
严格相等
由于普通的相等性检查==在比较时,如果不含有null
和undefined
时,比较都会转为数字再比较。
//false转为0,他们相等
alert( 0 == false ); // true
//空字符串转为0,false转为0,两者相等
alert( '' == false ); // true
//由于它们都会转为false再比较,所以无法区分出0,和false
严格相等运算符 === 在进行比较时不会做任何的类型转换。
换句话说,如果 a 和 b 属于不同的数据类型,那么 a === b 不会做任何的类型转换而立刻返回 false。
//严格相等不会进行类型转换,两者必须完全相等:类型一样,值一样
alert( 0 === false ); // false,因为被比较值的数据类型不同
同样的,与“不相等”符号 !=
类似,“严格不相等”表示为 !==
。