javascript基础知识篇一 —— 等于和全等

在平时写代码时,经常会对两个值做是否相等的比较,这看上去是非常简单,不值一提的事情,但有一些小细节,一定要注意。

等于(宽松相等) ==

相等操作符比较两个值是否相等,在比较前将两个被比较的值转换为相同类型。在转换后(等式的一边或两边都可能被转换),最终的比较方式等同于全等操作符 === 的比较方式。

转换规则如下:

  • 如果其中一个操作数的类型为 Boolean ,那么,首先将它转换为数字类型,false 转换为 0, true 将转换为 1。
  • 如果其中一个操作数的类型是字符串,另外一个为数字类型,那么,将字符串转换为数字进行比较。
  • 如果其中一个操作数的类型是字符串,另外一个为 object 类型,那么,将调用对象的 toString 方法之后,比较字符串。
  • 如果其中一个操作数的类型是数字类型,另外一个为 object 类型,那么,将对象转换为数值后进行数字比较。

以下规定了一些特殊的比较:

  • null 和 undefined 是相等的。
  • null 和 undefined 不会转换为任何其他类型
  • 如果任何一个操作的结果为 NaN,那么相等比较返回 false,不相等比较返回 true。注意,即使两个操作数都为 NaN,返回结果一样是 false,也就是说,NaN 不等于 NaN。
  • 如果两个操作数都是对象,那么比较它们引用的值,如果引用同一个对象,那么,返回真,否则,返回假。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// DEMO

null == undefined
=> true
false == 0
=> true
true == 1
=> true
0 == new String("0")
=> true
undefined == false
=> false
null == false
=> false
NaN == NaN
=> false

全等(严格相等) ===

全等操作符比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换。如果两个被比较的值具有不同的类型,这两个值是不全等的。

  • 两个被比较的值类型相同,值也相同,并且都不是 number 类型时,两个值全等
  • 两个值都是 number 类型,当两个都不是 NaN,并且数值相同,或是两个值分别为 +0 和 -0 时,两个值被认为是全等的
1
2
3
4
5
6
7
8
9
10
11
12
// DEMO

0 === "0"
=> false
false === "false"
=> false
null === undefined
=> false
+0 === -0
=> true
1 === 1.0
=> true

看完上面的介绍,是否对 “等于” 和 “全等” 有了更深入的理解呢?如果还是担心自己掌握的不够牢固,那建议你彻底抛弃“等于”,因为“全等”操作符的结果更容易预测,并且因为没有隐式转换,全等比较的操作会更快。

参考链接