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

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

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

两个String 对象总是不相等的。 请注意,JavaScript具有string原始值以及用于创build包装对象的String构造函数。 所有的对象相等比较(特别是对于=== )是作为参考平等的testing来执行的。 提到两个不同的对象当然永远不会彼此相等。

所以"hello" === "hello"将是true因为那些是string原语。

比较对象实例,不像string比较( 'hello' === 'hello' )比较Javascript中的对象实际上是比较对象的内存地址,并且总是返回false,因为每个对象的内存地址是不同的。

比较string值而不是对象实例 – jsFiddle

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

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

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

严格比较两个string – 真实,相同的返回值和相同的返回types

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

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

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

它[新]是4件事情:

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

您要求javascript比较variables的两个不同实例,而不是variables中的string值。

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

当你说的是Paper1 === Paper2时,你会得到错误,因为尽pipe写在纸上的文字是相同的,但是它们不是完全相同的纸。

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

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

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

堆与堆栈

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

你可以比较两个文字对象(就像我的第一个例子),通过对这些对象进行循环,当你发现不同时,你就知道结果。 在一个实例化的对象中做这个技巧是比较困难的,比较两个函数是疯狂的。

但是,如果JavaScript不为你做这是因为这是非常沉重的,你检查每个属性的每种types,如果它是一个函数等string…显然这是没有用的做到这一点。

如果你想检查2个对象“起源”,你可以使用instanceof,因为typeof将返回你的“对象”。 而对于testing2“new String”对象,你必须使用toString new String(“hello”).toString()== new String(“hello”).toString()或者如果你想检查对象而不testing属性new String(“hello”)instanceof String && new String(“hello”)instanceof String

是真的。

由BeyelerStudios给出的链接完全解释了新的做法,希望它会有所帮助。

你的代码基本上是说:“拿一张纸,写上'你好',再拿一张纸写'你好',它们是同一张纸吗?