0

我看过很多关于 identity equal operator的解释===,但似乎它们并不像我们对其他语言(如 Java)中身份相等的理解那样准确。

似乎对于基本类型(例如数字、字符串),===返回 true 表示两个变量是否具有相同的类型和值。但不一定相同的身份(对同一对象的引用)。但对于数组和地图,它确实如此。以下是一些让我感到困惑的例子:

s1 = 'a' + '1'
    s2 = 'a' + '1'
    s1 === s2  // true, even they actually reference two different 
objects in memory which suppose to be different identities. 
    
    
    a1 = [1,2]
    a2 = [1,2]
    a1 === a2  // false, as they reference two different objects in memory, even their values are the same.

有人可以确认我的理解是正确的吗?Javascript中的字符串也有真正的身份相等性检查。即s1 === s2应该false在上面的例子中返回?

4

2 回答 2

1

感谢您的回答。我认为真相的来源是关于Strict Equality Comparison的 Javascript 语言规范。它清楚地指定了SameValueNonNumber(x, y)中的行为。令人困惑的是,许多文章误用了Identity Equality一词而不是Strict Equality ,基于规范没有这样的Identity Equality概念。(尽管它与第 8 项中指定的 Object 类型的行为相似SameValueNonNumber(x, y))。所以我相信答案是不可能在 Javascript 中进行字符串身份相等检查。

于 2020-07-09T05:53:11.667 回答
0

这是因为字符串是原始类型,而数组是对象类型。可以像您期望的那样比较基元,但是在比较对象时,您是在比较引用而不是对象本身。

s1 = new String('a1');
s2 = new String('a1');
s1 === s2 // false

MDN 上的平等比较和相同性

如果你不确定你在处理什么(像numberor string,或 an之类的原始数据object),typeof有没有办法弄清楚

typeof new String() // object
typeof '' // string
于 2020-07-09T02:43:15.007 回答