JS中==与===的区别

161 阅读3分钟

导演大卫·林奇是当代美国非主流电影的代表人物。
他的影片以华丽、阴郁、诡异夹带着黑色幽默的风格在影坛独树一帜。
他往往在公路片的形式格局中,
运用弗洛伊德的心理分析,
展示出现代人焦虑郁闷的精神症候。
其在现实与超现实之间的自由游走,
对暴力和性的大胆表现,
前卫奇异、极具视觉冲击力的影像,
都使他的作品散发出独特的个人魅力。

他执导的《穆赫兰道》、《我心狂野》、《象人》、《双峰》等作品都已成为经典。

定义

  • = 赋值
  • == 相等
  • === 严格相等

相同点

它们两个运算符都允许任意类型的的操作数,如果操作数相等,返回true,否则返回false。

不同点

==:运算符称作相等,用来检测两个操作数是否相等,这里的相等定义的非常宽松,可以允许进行类型转换。两边类型不同,比较时会先进行隐式转换,再比较。

===:用来检测两个操作数是否严格相等,两边的量与量的类型必须完全相同。

比较过程

双等号==

  • 如果两个值类型相同,再进行三个等号(===)的比较   
  • 如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:
    • 如果一个是 null,另一个是 undefined,那么相等
    • 如果一个是字符串,另一个是数值,把字符串转换成数值之后再进行比较
    • 如果一个是布尔型,另一个是数值,把布尔值转换成数值之后再进行比较
    • 如果一个是字符串或者数值,另一个是对象,把对象转换成原始值再进行比较
    • NaN与所有值相比都是false
x y 结果
null undefined true
Number String x==Number(y)
Boolean any Number(x)==y
Object String/Number toPrimitie(x)==y
otherwise otherwise false

不同类型数据Number()后的结果:

类型 结果
undefined NaN
null 0
Boolean true->1 ; false ->0
String "abc"->NaN ; "123"->123

toPrimitie()

type Result
基本类型 原始值
对象 首先找valueof()属性,如果没有定义,然后尝试找toString()属性

toPrimitive方法对于不同类型的返回结果

  • 基本类型直接返回,基本类型的值

  • 如果是对象类型,分以下几种情况:

    • 如果对象的ValueOf方法的结果是原始值,返回原始值
    • 如果对象的toString方法返回原始值,就返回这个值
    • 其他情况都返回一个错误

示例如下:

100 == "100"            // true
1 == true               // true
true=="1"               // true
true=="01"               // true
null == null            // true
undefined == undefined  // true
null == undefined       // true
true == "20"            // false
"1" == "01"             // false,此处等号两边值得类型相同,不要再转换类型了!
NaN == NaN              // false,NaN和所有值包括自己都不相等。

三等号===

  • 如果类型不同,就一定不相等
  • 如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是 NaN,那么不相等。(判断一个值是否是 NaN,只能使用 isNaN( ) 来判断)
  • 如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。
  • 如果两个值都是 true,或是 false,那么相等
  • 如果两个值都引用同一个对象或是函数,那么相等,否则不相等
  • 如果两个值都是 null,或是 undefined,那么相等

示例如下:

100 === "100"            // false
1 === true               // false
NaN === NaN              // false
null === undefined       // false
'abc' === "abc"          // true
false === false          // true
null === null            // true
undefined === undefined  // true