为什么新的String('hello')=== new String('hello')计算为False?

时间:2014-09-03 15:00:27

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

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

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

7 个答案:

答案 0 :(得分:58)

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

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

答案 1 :(得分:17)

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

答案 2 :(得分:12)

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

相关文章:What is the 'new' keyword in JavaScript?其中(广泛的)答案解释了:

  

它[新]是4件事:

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

答案 3 :(得分:8)

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

例如,假设我有一张纸,上面写着“Hello World”字样(Paper1),我哥哥的另一张纸上写着“Hello World”字样(Paper2) 。

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

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

答案 4 :(得分:6)

typeof(new String()) === 'object';
==> true

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

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

Heap vs. Stack

答案 5 :(得分:5)

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

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

但是如果JavaScript没有为你做这件事,因为它很重,你检查每个属性的每种类型,如果它是一个功能等,就会对它进行字符串化......显然它没用。

如果你想检查2个对象"起源",你可以使用instanceof,因为typeof将返回你" object"。 并且用于测试2" new String"你必须使用toString的对象     new String(" hello")。toString()== new String(" hello")。toString() 或者如果要在不测试属性的情况下检查对象     new String(" hello")instanceof String&& new String(" hello")instanceof String

是真的。

BeyelerStudios提供的链接完美地解释了新手所做的事情,希望它有所帮助。

答案 6 :(得分:5)

你的代码基本上是说“拿一张纸在上面写'你好'。拿另一张纸然后写上'你好'。它们是同一张纸吗?”