3

我正在做一个关于难以理解的 JavaScript 代码的讲座,当然 JavaScript 的弱点是知道 == / === 会返回什么。我在堆栈中找到了这个很好的答案,它很好地涵盖了这个主题 - JavaScript 比较中应该使用哪个等于运算符(== vs ===)?

引起我注意的一件事(可能是因为我直到现在才意识到)是您可以使用字符串对象而不是原语,并且您会在您的条件下得到不同的结果 -

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

我想对其进行测试,并使用字符串对象发现了一些不太直观的结果-

new String("abc") === new String("abc")    // false

乃至

new String("abc") == new String("abc")   // false

一开始我认为这是一个浏览器错误,但我在 chrome 和 Firefox 上都对其进行了测试。因此,如果有人可以分享更多信息,我会非常高兴,如何比较文字字符串和字符串对象是真实的,但比较两个“相等”的字符串对象是虚假的

4

1 回答 1

5

比较两个“相等”的字符串对象将是虚假的

我已经强调了上面的重要词。两个对象引用永远不会彼此相等,除非它们引用完全相同的对象

您正在创建两个新的String. 这是两个独立的对象,即使它们确实具有相同的字符串值。

var s1 = new String("abc"),
    s2 = new String("abc");

s1 === s1; // true
s1 === s2; // false

这在规范中通过抽象相等算法严格相等算法中的以下行进行了总结:

true如果xy引用同一个对象,则返回。否则,返回false

于 2013-04-22T14:32:19.067 回答