【问题标题】:Why does new String('hello') === new String('hello') evaluate to False? [duplicate]为什么 new String('hello') === new String('hello') 评估为 False? [复制]
【发布时间】:2017-10-27 02:32:31
【问题描述】:

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

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

【问题讨论】:

  • 它可能是在比较字符串的位置,而不是实际的字符串。如果将字符串保存到变量中,然后比较变量,它应该返回 true。
  • 出于同样的原因,[] === []false
  • 供参考:stackoverflow.com/a/3586788/899126。基本上,这是因为比较不是在两个字符串之间进行,而是在两个对象之间进行。您可以在字符串对象上调用.valueOf(),您的比较将返回true。
  • @aashnisshah 也返回 false
  • @aashnisshah:变量对比较值没有任何影响。它们只是占位符。

标签: javascript equality comparison-operators equality-operator identity-operator


【解决方案1】:

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

所以"hello" === "hello" 将是true,因为它们是字符串原语。

【讨论】:

  • 如果操作数的类型相同,那么=====是相同的,所以new String('hello') == new String('hello')也是false
  • 谢谢,但我仍然不确定为什么如果 a = {} 和 b = {},那么 a === b 和 a == b 会返回 false
  • @santoshkore:因为您正在比较 两个不同的对象。一家汽车制造商生产两辆相同型号的汽车。这些汽车相似,但它们不一样。当您比较对象时,您是在测试身份,而不是相似性。
  • 如果要使用字符串实习怎么办?两个不同的对象会合并为一个吗?还是字符串实习仅用于字符串primitives
  • @ColeJohnson 我认为 JavaScript 解释器不允许合并两个不同的对象;这将是奇怪的行为。请注意,String 实例中的字符串原语本身可以被实习。实际上,String 实例除了对原语的引用和指向其原型的链接外,并没有太多的意义。
【解决方案2】:

它的计算结果为 false,因为您正在比较两个不同的对象:new 将创建一个新对象。

相关帖子:What is the 'new' keyword in JavaScript? 在其(广泛的)答案中进行了解释:

它 [新] 是 4 件事:

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

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 虽然这是真的,但我怀疑 stackoverflow 会在他们更改其 url 生成时处理它自己的链接。其他人很快就回答了这个问题,所以我没有进一步说明。
  • 你仍然不应该有只是一个链接的答案。
【解决方案3】:

您是在比较对象实例,这不像是字符串比较 ('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')

【讨论】:

  • 这里有什么区别?您应该详细说明(因为您没有直接回答 OP 的问题)。
  • new String("hello") === new String("hello") 检查类型和引用,这就是为什么它返回 false 得到它但 new String("hello") == new String("hello") 是比较对象而不是值这意味着什么?我一直在想 == 只比较值。请详细说明
  • 更新了我的答案以澄清更多
  • @santoshkore:对象值。它们是 Object 数据类型的值。区别在于String() 返回一个原始值,而new String() 返回一个对象值。原始值不像对象那样是唯一的,它们没有 ID。因此,当您比较它们时,没有其他东西可以作为它们的原始数据进行比较。不过,每个对象都是独一无二的,所以如果您比较对象,您就是在比较它们的身份。
  • 致其他人:请注意此答案的字符串比较中缺少 new 关键字。
【解决方案4】:

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

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

但如果 JavaScript 不为你做这件事,那是因为这很重,你必须检查每个属性的每种类型,如果它是一个函数等,则将其字符串化……显然这样做没有用。

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

是真的。

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

【讨论】:

    【解决方案5】:
    typeof(new String()) === 'object';
    ==> true
    
    (new Object()) === (new Object());
    ==> false
    

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

    Heap vs. Stack

    【讨论】:

      【解决方案6】:

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

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

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

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

      【讨论】:

      • “你是在要求 javascript 比较变量的两个不同实例” 非常令人困惑。变量只是值的容器,您不能创建变量的“实例”。
      • 我喜欢这个比喻,+1
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 2012-06-12
        • 2013-11-25
        • 2012-06-05
        • 2010-11-26
        • 1970-01-01
        • 2018-08-31
        相关资源
        最近更新 更多