题目
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
