javascript基础知识篇一 —— 等于和全等
在平时写代码时,经常会对两个值做是否相等的比较,这看上去是非常简单,不值一提的事情,但有一些小细节,一定要注意。
等于(宽松相等) ==
相等操作符比较两个值是否相等,在比较前将两个被比较的值转换为相同类型。在转换后(等式的一边或两边都可能被转换),最终的比较方式等同于全等操作符 === 的比较方式。
转换规则如下:
- 如果其中一个操作数的类型为 Boolean ,那么,首先将它转换为数字类型,false 转换为 0, true 将转换为 1。
- 如果其中一个操作数的类型是字符串,另外一个为数字类型,那么,将字符串转换为数字进行比较。
- 如果其中一个操作数的类型是字符串,另外一个为 object 类型,那么,将调用对象的 toString 方法之后,比较字符串。
- 如果其中一个操作数的类型是数字类型,另外一个为 object 类型,那么,将对象转换为数值后进行数字比较。
以下规定了一些特殊的比较:
- null 和 undefined 是相等的。
- null 和 undefined 不会转换为任何其他类型
- 如果任何一个操作的结果为 NaN,那么相等比较返回 false,不相等比较返回 true。注意,即使两个操作数都为 NaN,返回结果一样是 false,也就是说,NaN 不等于 NaN。
- 如果两个操作数都是对象,那么比较它们引用的值,如果引用同一个对象,那么,返回真,否则,返回假。
1 | // DEMO |
全等(严格相等) ===
全等操作符比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换。如果两个被比较的值具有不同的类型,这两个值是不全等的。
- 两个被比较的值类型相同,值也相同,并且都不是 number 类型时,两个值全等
- 两个值都是 number 类型,当两个都不是 NaN,并且数值相同,或是两个值分别为 +0 和 -0 时,两个值被认为是全等的
1 | // DEMO |
看完上面的介绍,是否对 “等于” 和 “全等” 有了更深入的理解呢?如果还是担心自己掌握的不够牢固,那建议你彻底抛弃“等于”,因为“全等”操作符的结果更容易预测,并且因为没有隐式转换,全等比较的操作会更快。