JavaScript中6种值为false
0 // (数字0)
"" // (空字符串)
null
undefined
NaN
false
// 以上6种值为false
值的比较
一、 比较运算符
比较运算符在逻辑语句中使用,用以测定变量或值是否相等
例:x = 5 (比较的结果为Boolean类型!!!)
运算符 | 描述 | 比较 | 返回值 |
---|---|---|---|
== | 等于 | x == 8 | false |
=== | 绝对等于(值和类型均相等) | x === ‘5’ | false |
!= | 不等于 | x != 8 | true |
!== | 不绝对等于(值和类型有一个不相等,或两个都不相等) | x !== ‘5’ | true |
> | 大于 | x > 8 | false |
< | 小于 | x < 8 | true |
>= | 大于或等于 | x >= 8 | false |
<= | 小于或等于 | x <= 8 | true |
二、比较规则
非严格相等运算符比较(隐式转换)
1. NaN与任何数字比较都不相等(包括它自身)
- 没有隐式转换,无条件返回false
NaN == NaN // false
NaN == Infinity // false
2. 比较的两方是string, boolean, number类型
- 隐式转换,会将不是数字类型的转换为数字再比较
1 == true // true
1 == 'true' // false Number('true') = NaN
1 == !'true' // false
- 第一行代码中,true转换为数字是1
- 第二行代码中,‘true’(字符串true)转换数字是NaN
- 第三行代码中,首先要先将’true’(字符串true),转换为布尔值,再进行布尔值的取反运算,最后将布尔值转换为数字,进行比较
1. Boolean(‘true’) ⇒ true
2. !true ⇒ false
3. Number(false) ⇒ 0
4. 1 == 0 ⇒ false
3. null 和 undefined
- 使用非严格相等 == 比较二者时,JavaScript存在一个特殊的规则,会判断它们相等,不能将它们转换为任何值
null == undefined // true
- 使用严格相等 === 比较二者时,它们不相等,因为它们属于不同的类型
null === undefined // false
- 使用其他比较方法 <, >, <=, >= 时,null和undefined会被转换为数字。
- null 被转换为0,undefined被转换为NaN
null
null > 0 // false
null == 0 // false
null >= 0 // true
看完这三行代码,感到怀疑人生,在最后一行代码显示 “null >= 0 的值是true” 的情况下,那么前两行代码中应该会有一个是true,然而结果显示都是false
出现这种结果的问题在哪:
- 相等比较符(==)和 普通比较符(>, < ,>= ,<=)代码逻辑是相互独立的。当使用普通比较符进行值比较时,null会被转换为数字0,所以第三行代码返回值是true(0 >= 0),第一行代码返回值是false(0 > 0)
- undefined 和 null 在相等比较符(==)中不会进行任何的类型转换,有独立的比较规则,除了 null == undefined ,不会等于任何其他的值,所以第二行代码返回值是false,第二行代码比较中null并没有转换为数字0
undefined
undefined > 0 // false
undefined == 0 // false
undefined < 0 // false
- 第一行和第三行代码返回值都是false,是因为使用普通比较符进行值比较时,undefined会转换为NaN,而NaN是一个特殊的数字,NaN与任何值进行比较都会返回false
- 第二行代码的返回值为false,同null == 0 返回值为flase的理由一致 (注:转换为数字:null 被转换为0,undefined被转换为NaN)
字符串比较
- 在比较字符串的大小时,JavaScript会使用“字典”(dictionary)或“词典”(lexicographical)顺序进行判定。
- 换言之,字符串是按字符(母)逐个进行比较的
'Z' > 'A' // true
'James' > 'Kobe' // false
'Glow' > 'Glee' // true
'James' > 'Jame' // true
// 特殊
'a' > 'A' // true
- 字串的比较算法:
- 首先比较两个字符串的首位字符大小
- 若一方字符较大,则该字符串大于另一个字符串,算法结束
- 否则,若两个字符串的首位字符相等,则继续取出两个字符串各自的后一位字符进行比较
- 重复上述步骤进行比较,直到比较完成某字符串的所有字符为止
- 若两个字符串的字符同时用完,那么判定它们相等,否则未结束(还有未比较的字符)的字符串更大
在上面的例子中,‘z’ > ‘A’ 在比较算法中,第一步就得到结果,‘James’ > ‘Kobe’ 也是第一步就得到结果了,而后两行字符串比较则继续逐个字符比较:
’Glow’ 和 'Glee’
- G 和 G 相等
- l 和 l 相等
- 0 比 e 大,算法停止,所以’Glow’ > ‘Glee’
’James’ 和 'Jame’
- J 和 J 相等,a 和 a 相等,m 和 m 相等,e 和 e 相等
- 根据比较算法中的最后一步,两个字符串的字符同时用完,那么判定它们相等,否则未结束(还有未比较的字符)的字符串更大,所以’James’ > ‘Jame’
然而有个特别之处,‘a’ > ‘A’ 为true
字符串比较: 非真正的字典顺序,而是Unicode 编码顺序
字符串比较对字母的大小写是敏感的,大写的**“A"并 不等于 小于写的"a”,实际上小于写的"a"**更大
这是因为JavaScript使用的内部编码表(Unicode)中,小写字母的字符索引值更大
三、总结
- 比较运算符始终返回布尔值
- NaN与任何数字比较都不相等(包括NaN本身)
- 对不同类型的值进行比较时,会先将它们转换为数字(不包括严格相等===),再进行比较
- 再非严格相等==情况,null 和 undefined 相等,但是不等于其他任何值(非严格相等情况下,null和undefined不会转换为任何值)
- 字符串比较,会按照‘词典’顺序逐字的比较大小