为什么以下语句在 JavaScript 中返回 false?
new String('hello') === new String('hello')
为什么以下语句在 JavaScript 中返回 false?
new String('hello') === new String('hello')
两个 String对象总是不相等的。请注意,JavaScript 具有字符串原始值以及用于创建包装对象的 String 构造函数。所有对象相等性比较(尤其是与)都是作为参考相等性===
测试进行的。对两个不同对象的引用当然永远不会彼此相等。
因为这些是字符串原语"hello" === "hello"
。true
您正在比较对象实例,这不像字符串比较 ( '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')
它评估为 false 因为您正在比较两个不同的对象: new 将创建一个新对象。
相关文章:JavaScript 中的“new”关键字是什么?这在其(广泛的)答案中解释了:
它[新] 是 4 件事:
- 它创建一个新对象。这个对象的类型,就是object。
- 它将这个新对象的内部、不可访问的[[prototype]]属性设置为构造函数的外部、可访问的 原型对象(每个函数对象都自动具有原型属性)。
this
每当提到时,它都会使用新创建的对象执行构造函数。- 它返回新创建的对象,除非构造函数返回非原始值。在这种情况下,将返回该非原始值。
您要求 javascript 比较变量的两个不同实例,而不是变量内部的字符串值。
例如,假设我有一张纸,上面写着“Hello World”(Paper1),而我的兄弟有一张不同的纸,上面写着“Hello World”(Paper2)。
当您说是 Paper1 === Paper2 时,您会得到错误的结果,因为不,它们不是完全相同的纸,即使纸上写的字相同。
如果你在哪里说 Paper1.toString() === Paper2 .toString() 你会得到正确的,因为我们正在比较纸上写的文字,而不是实际的纸本身。
您的代码本质上是说“拿一张纸,在上面写上‘你好’。再拿一张纸,在上面写上‘你好’。它们是同一张纸吗?”
如果你这样做 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 提供的链接完美地解释了新功能的作用,希望对您有所帮助。