February 01, 2016
先明确一点,在 JavaScript 中对象的比较是引用的比较,而不是值的比较。对象和本身是相等的,和其他任何对象都是不相等的。
变量名保存的是对象在内存中的引用地址,我们把创建的的对象赋值给我们声明的变量名时,就是将引用赋值给变量.
==
和 ===
的区别在于,前者进行比较时会将两边的表达式的值按照规则进行类型转换后再来判断,而后者计算出两边的操作数的值后并不做类型转换,所以后者的比较是严格的判断类型与值的比较方式。
===
的使用如果两个值类型不同,则他们不相等
NaN
和任何值都不相等包括它本身,所以 NaN === NaN
的结果为 false
,所以如果想要判断一个值是否为 NaN
时,可以使用 x !== x
,该表达式的结果仅当 x
为 NaN
是的时候才为 true
如果两个引用值指向同一个对象、数组或函数,则他们是相等的。如果指向不同的对象,则他们是不等的,尽管两个对象具有完全一样的属性
==
的使用如果两个操作数的类型相同,则和上述的严格相等的比较规则是一样的,结果是相同的。
如果两个操作数的类型不同,将会按照以下规则进行类型转换:
null == undefined
如果比较数字与字符串,先将字符串转换成数字,然后比较两个数字的值是否相等
如果其中一个值是 true
,则将其转换为 1
后再进行比较,false
转换为 0
如果一个值是对象,另一个值是数字或字符串时,JavaScript 语言内置类首先尝试使用 valueOf()
,再尝试使用 toString()
,除了日期类,日期类只使用 toString()
转换。那些不是 JavaScript 语言核心中的对象则通过各自的实现中定义的方法转换为原始值
其他不同类型之间的比较都不相等
'1' == true // true
布尔值 true
首先转化为 1
,然后字符串 "1"
和 数字 1
比较的时候转换成数字 1
,所以结果为 true