如何对 Javascript 中的字符串进行真实身份相等性检查

How to do real identity equality check for string in Javascript

我看过很多关于恒等运算符===的解释,但似乎不像我们在其他语言如Java中对恒等的理解那样准确。

似乎是针对基本类型(例如数字、字符串),=== return 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.

有人可以确认我的理解是正确的吗? Java 脚本中是否还有对字符串的真实身份相等性检查。即在上面的例子中 s1 === s2 应该 return false?

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

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

Equality comparisons and sameness over on MDN

如果您不确定自己正在处理什么(像 numberstringobject 这样的原语),typeof 可以解决

typeof new String() // object
typeof '' // string

感谢您的回答。我认为真相的来源是关于 Strict Equality Comparison. It clearly specifies the behavior in SameValueNonNumber(x, y) 的 Javascript 语言规范。令人困惑的是,许多文章误用了术语 Identity Equality 而不是 Strict Equality,没有 Identity Equality[=17] 这样的概念=] 基于规范。 (尽管它与 SameValueNonNumber(x, y) 中第 8 项中指定的对象类型的行为相似)。所以我相信答案不可能在 Javascript.

中进行字符串身份相等性检查