if
和==
都会发生强制类型转换
if
if(xx)
的含义是判断xx是否为"真值",很好判断,因为"假值"只有6个:
false
undefined
null
0
"" //空字符串
NaN
除此以外的所有值都可以判断为true
非严格相等
可以以一个方式快速判断非严格相等的值,即左右都转化为数字,对于 Object 类型,先尝试调用 .valueOf 方法获取结果。 如果没定义,再尝试调用 .toString方法获取结果
- 字符串和数字之间的相等比较
var a = 42
var b ='42'
a == b //true
- 其它类型与布尔值之间的相等比较
var a = '42'
var b = true
a == b // false 因为42不等于1
- null和undefined之间宽松相等
在==
中null
和undefined
相等(它们也与其自身相等),除此之外的其它值都不存在这种情况
var a = null //0
var b //NaN
a == b // true
a == null // true
b == null // true
a == false // false
b == false // false
a == "" // false
b == "" // false
a == 0 // false
b == 0 // false
- 对象和非对象之间的相等比较
var a = 42
var b = [42]
a == b // true
- 极端情况:
[] == ![]
我们先来分析一下:首先![]
会被转换为false
,变为[] == false
,然后[]
通过ToPrimitive操作转换为''
,即'' == false
,然后false
通过ToNumber转换为0,变为'' == 0
,最后''
通过ToNumber转换为0,变为0 == 0
,结果为true
安全运用隐式强制类型转换
我们要对==两边的值进行认真推敲,一下两个原则可以让我们有效的避免出错。
如果两边的值中有true
或false
,千万不要使用==
如果两边的值中有[]
、''
或者0,尽量不要使用==
隐式强制转换在部分情况下确实很危险,为了安全起见就要使用===
网友评论