51

为什么以下语句在 JavaScript 中返回 false?

new String('hello') === new String('hello')
4

7 回答 7

62

两个 String对象总是不相等的。请注意,JavaScript 具有字符串原始值以及用于创建包装对象的 String 构造函数。所有对象相等性比较(尤其是与)都是作为参考相等性===测试进行的。对两个不同对象的引用当然永远不会彼此相等。

因为这些是字符串原语"hello" === "hello"true

于 2014-09-03T15:02:09.957 回答
19

您正在比较对象实例,这不像字符串比较 ( 'hello' === 'hello') 在 Javascript 中比较对象实际上是比较对象的内存地址,并且总是会返回 false,因为每个对象的内存地址都不同。

比较字符串值而不是对象实例 - jsFiddle

( String('hello') === String('hello') ) // returns true due to comparing strings

严格比较两个对象 - false不是同一个对象

new String('hello') === new String('hello')

严格比较两个字符串 - true,相同的返回值和相同的返回类型

String('hello') === String('hello')
于 2014-09-03T15:06:48.323 回答
12

它评估为 false 因为您正在比较两个不同的对象: new 将创建一个新对象。

相关文章:JavaScript 中的“new”关键字是什么?这在其(广泛的)答案中解释了:

它[新] 是 4 件事:

  1. 它创建一个新对象。这个对象的类型,就是object
  2. 它将这个新对象的内部、不可访问的[[prototype]]属性设置为构造函数的外部、可访问的 原型对象(每个函数对象都自动具有原型属性)。
  3. this每当提到时,它都会使用新创建的对象执行构造函数。
  4. 它返回新创建的对象,除非构造函数返回非原始值。在这种情况下,将返回该非原始值。
于 2014-09-03T15:03:39.900 回答
8

您要求 javascript 比较变量的两个不同实例,而不是变量内部的字符串值。

例如,假设我有一张纸,上面写着“Hello World”(Paper1),而我的兄弟有一张不同的纸,上面写着“Hello World”(Paper2)。

当您说是 Paper1 === Paper2 时,您会得到错误的结果,因为不,它们不是完全相同的纸,即使纸上写的字相同。

如果你在哪里说 Paper1.toString() === Paper2 .toString() 你会得到正确的,因为我们正在比较纸上写的文字,而不是实际的纸本身。

于 2014-09-03T18:20:28.697 回答
6

您的代码本质上是说“拿一张纸,在上面写上‘你好’。再拿一张纸,在上面写上‘你好’。它们是同一张纸吗?”

于 2014-09-03T22:35:18.347 回答
6
typeof(new String()) === 'object';
==> true

(new Object()) === (new Object());
==> false

“堆”中的任何“对象”结构都是唯一的;

堆与堆栈

于 2014-09-03T16:10:45.517 回答
5

如果你这样做 if ( { hello: 1 } === { hello: 1 } ){ console.log( "yay" ); console.log 永远不会发生,因为它是一个对象。

您可以通过对这些对象进行循环来比较 2 个文字对象(作为我的第一个示例),当您发现差异时,您就会知道结果。在实例化对象中做这个技巧更难,比较 2 个函数,这太疯狂了。

但是,如果 JavaScript 不为您执行此操作,那是因为这很重,您必须检查每个属性的每种类型以将其字符串化(如果它是函数等)……显然这样做没有用。

如果要检查 2 个对象“来源”,可以使用 instanceof,因为 typeof 会返回“对象”。对于测试 2“新字符串”对象,您必须使用 toString new String("hello").toString() == new String("hello").toString() 或者如果您想在不测试属性的情况下检查对象new String( "hello" ) instanceof String && new String( "hello" ) instanceof String

是真的。

BeyelerStudios 提供的链接完美地解释了新功能的作用,希望对您有所帮助。

于 2014-09-03T15:29:08.967 回答