题目

  1. var a = ?;
  2. if(a == 1 && a == 2 && a == 3){
  3. conso.log(1);
  4. }

松散等于( == )与严格等于( === )

关于 ===== ,一个常见的说法是: == 判断值是否相等,而 === 判断类型和值是否相等。
然而这个说法是错误的。实际上,在比对的过程中, == 允许强制类型转换而 === 不允许强制类型转换。

===== 的比对性能

当比对相同类型的值时, ===== 的工作是一样的。
当比对不同类型的值时,性能(效率)已经不是最重要的考虑因素,而是要考虑在比对的过程中,是否想要进行类型转换。
所以, ===== 实际上都会进行类型的比对,而不同的点在于是否需要进行类型转换。

强制转换规则

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