在javascript的运用中,经常遇到判断两个 对象/值 是否相等的情况。有些表明上看着一样,其实他们不一样。有些特殊情况,需要我们辨别。
引用类型
他们都是引用类型,存储的空间将从堆中分配。变量处的值是一个指针,指向存储对象的内存处。
具有相同属性的两个对象。
var a = { x : 1 }
var b = { x : 1 }
a === b // false 两个单独的对象永不相等
a == b // false 两个单独的对象永不相等
他们实际是new Object()
的简写。初始化变量a时候,赋了一个对象值,那么在堆中开辟了一个新空间。
初始化变量b时候,也是开辟了一个新空间。两个变量,所指向的内存地址是不一样的。
两个单独的空数组.
var a = [], b = []
a === b // false 两个单独的数组永不相等。
a == b // false 两个单独的数组永不相等。
以上两个例子,原理相同。
原始类型
判断Number类型的值是否为NaN
ECMAScript (ES6)包含Number.isNaN()函数。
通过Number.isNaN(x)
来检测变量x是否是一个非数值。然而,在缺少Number.isNaN
函数的情况下,通过表达式(x != x)
来检测变量x是否是NaN
会更加可靠。
String类型
String类型,我目前没有发现相同字面量,会不相等的情况。
Symbol类型
const s1 = Symbol()
const s2 = Symbol()
s1 == s2 // false
s1 === s2 // false
Symbol()函数返回symbol类型的值,都是唯一的,不相等的,并且具有静态属性和静态方法。
[完]