为什么新号码(2)!=JavaScript中的新字符串(“2”)

为什么新号码(2)!=JavaScript中的新字符串(“2”),javascript,object,javascript-objects,Javascript,Object,Javascript Objects,以下计算结果为true: new Number(2) == 2 new String("2") == "2" 很明显,但以下情况也是如此: "2" == 2 new Number(2) == "2" new String("2") == 2 那么,有人能清楚地解释他为什么要计算false new Number(2) == new String("2") 因为JavaScript同时具有数字和字符串(以及布尔值)的基本版本和对象版本新编号和新字符串创建对象版本,当您将=与对象引用一起使用时,

以下计算结果为
true

new Number(2) == 2
new String("2") == "2"
很明显,但以下情况也是如此:

"2" == 2
new Number(2) == "2"
new String("2") == 2
那么,有人能清楚地解释他为什么要计算
false

new Number(2) == new String("2")

因为JavaScript同时具有数字和字符串(以及布尔值)的基本版本和对象版本<代码>新编号和
新字符串
创建对象版本,当您将
=
与对象引用一起使用时,您是在比较对象引用,而不是值


newstring(x)
String(x)
是根本不同的东西(对于
Number
也是如此)。使用
new
操作符,您正在创建一个对象。如果没有
new
操作符,您正在执行类型强制-例如
String(2)
给您
“2”
数字(“2”)
给您
2

我认为
=
基本上是进行值比较

最重要的是,它只是比较数值。但是在这个

new Number(2) == new String("2")
两者都是对象,因此它不比较值,而是尝试比较对象引用的值。这就是为什么它返回
false

请尝试:

new Number(2) == new Number(2)
返回

假的


你会得到答案:有两个不同的对象有两个不同的引用。

隐式类型的强制解释了“2”==2examples@dougajmcdonald:否。您创建了两个对象并正在尝试比较它们。在这种情况下,
==
将比较引用,而不是使用类型转换。请参阅:关于对象对对象身份的平等性测试;大多数灵长类的对象相等(布尔运算除外?)测试两个操作数的字符串化形式。@T.J.Crowder Right我忘了我们先字符串化对象,然后对字符串进行编号,如果另一个操作数是数字。我认为我已经做了足够多的“逐步通过抽象等式比较算法”的答案,现在已经记住了;唉,不啊,所以
newstring(“2”)==newstring(“2”)
newnumber(2)==newnumber(2)
一起是
false,更准确地说:它仍然在比较值。正在比较的值是对象引用。