js简单类型的比较运算规则

JavaScript中6种值为false


  0  // (数字0)
  ""  // (空字符串)
  null
  undefined
  NaN
  false
  // 以上6种值为false

值的比较

一、 比较运算符

比较运算符在逻辑语句中使用,用以测定变量或值是否相等
例:x = 5 (比较的结果为Boolean类型!!!)

运算符描述比较返回值
==等于x == 8false
===绝对等于(值和类型均相等)x === ‘5’false
!=不等于x != 8true
!==不绝对等于(值和类型有一个不相等,或两个都不相等)x !== ‘5’true
>大于x > 8false
<小于x < 8true
>=大于或等于x >= 8false
<=小于或等于x <= 8true

二、比较规则

非严格相等运算符比较(隐式转换)

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  
  • 使用其他比较方法 <, >, <=, >= 时,nullundefined会被转换为数字。
  • 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’

  1. G 和 G 相等
  2. l 和 l 相等
  3. 0 比 e 大,算法停止,所以’Glow’ > ‘Glee’

’James’ 和 'Jame’

  1. J 和 J 相等,a 和 a 相等,m 和 m 相等,e 和 e 相等
  2. 根据比较算法中的最后一步,两个字符串的字符同时用完,那么判定它们相等,否则未结束(还有未比较的字符)的字符串更大,所以’James’ > ‘Jame’

然而有个特别之处,‘a’ > ‘A’ 为true

字符串比较: 非真正的字典顺序,而是Unicode 编码顺序
字符串比较对字母的大小写是敏感的,大写的**“A"不等于 小于写的"a”,实际上小于写的"a"**更大
这是因为JavaScript使用的内部编码表(Unicode)中,小写字母的字符索引值更大

三、总结

  • 比较运算符始终返回布尔值
  • NaN与任何数字比较都不相等(包括NaN本身)
  • 对不同类型的值进行比较时,会先将它们转换为数字(不包括严格相等===),再进行比较
  • 再非严格相等==情况,null 和 undefined 相等,但是不等于其他任何值(非严格相等情况下,null和undefined不会转换为任何值)
  • 字符串比较,会按照‘词典’顺序逐字的比较大小

本文借鉴:
现代 JavaScript 教程 — 学会不同类型值的比较

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值