题目
var a = ?;
if(a == 1 && a == 2 && a == 3){
conso.log(1);
}
松散等于( ==
)与严格等于( ===
)
关于 ==
与 ===
,一个常见的说法是: ==
判断值是否相等,而 ===
判断类型和值是否相等。
然而这个说法是错误的。实际上,在比对的过程中, ==
允许强制类型转换而 ===
不允许强制类型转换。
==
与 ===
的比对性能
当比对相同类型的值时, ==
与 ===
的工作是一样的。
当比对不同类型的值时,性能(效率)已经不是最重要的考虑因素,而是要考虑在比对的过程中,是否想要进行类型转换。
所以, ==
与 ===
实际上都会进行类型的比对,而不同的点在于是否需要进行类型转换。
强制转换规则
Number vs String
Number == String
=> Number == toNumber(String)
String == Number
=> toNumber(String) == Number)
anything vs Boolean
any == Boolean
=> any == toNumber(Boolean)
Boolean == any
=> toNumber(Boolean) == any
null vs undefined
null == undefined
=> true
undefined == null
=> true
object(object/function/array) vs non-object(String / Number)
这里的
non-object
是String/Number,当non-object
为Boolean时,Boolean会先转成Number
non-object == object
=> non-object == toPrimitive(object)
object == non-object
=> toPrimitive(object) == non-object
toPrimitive
=> toString/valueOf
[]
=> [].toString
=> [].join