@jianhua.cheng

JavaScript中 == 和 === 使用的区别

February 01, 2016

先明确一点,在 JavaScript 中对象的比较是引用的比较,而不是值的比较。对象和本身是相等的,和其他任何对象都是不相等的。

变量名保存的是对象在内存中的引用地址,我们把创建的的对象赋值给我们声明的变量名时,就是将引用赋值给变量.

===== 的区别在于,前者进行比较时会将两边的表达式的值按照规则进行类型转换后再来判断,而后者计算出两边的操作数的值后并不做类型转换,所以后者的比较是严格的判断类型与值的比较方式

=== 的使用

  • 如果两个值类型不同,则他们不相等

  • NaN 和任何值都不相等包括它本身,所以 NaN === NaN 的结果为 false,所以如果想要判断一个值是否为 NaN 时,可以使用 x !== x,该表达式的结果仅当 xNaN 是的时候才为 true

  • 如果两个引用值指向同一个对象、数组或函数,则他们是相等的。如果指向不同的对象,则他们是不等的,尽管两个对象具有完全一样的属性

== 的使用

如果两个操作数的类型相同,则和上述的严格相等的比较规则是一样的,结果是相同的。

如果两个操作数的类型不同,将会按照以下规则进行类型转换:

  • null == undefined

  • 如果比较数字与字符串,先将字符串转换成数字,然后比较两个数字的值是否相等

  • 如果其中一个值是 true ,则将其转换为 1 后再进行比较,false 转换为 0

  • 如果一个值是对象,另一个值是数字或字符串时,JavaScript 语言内置类首先尝试使用 valueOf(),再尝试使用 toString(),除了日期类,日期类只使用 toString() 转换。那些不是 JavaScript 语言核心中的对象则通过各自的实现中定义的方法转换为原始值

  • 其他不同类型之间的比较都不相等

例子

'1' == true // true

布尔值 true 首先转化为 1,然后字符串 "1"和 数字 1 比较的时候转换成数字 1,所以结果为 true


Jianhua Cheng

Written by Jianhua Cheng who lives and works in Shanghai. Try to build something more attractive and interesting. You can follow him on Twitter, Github