Poi*_*nty 59

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

"hello" === "hello"将是true因为那些是字符串原语.

  • @santoshkore:因为你正在比较**两个不同的**对象.一家汽车制造商生产两辆相同型号的汽车.这些车*相似*,但它们*不一样*.比较对象时,您正在测试*identity*,而不是相似性. (16认同)
  • 如果操作数是相同的类型,那么`==`和`===`是相同的,所以`new String('hello')== new String('hello')`也是`false`. (3认同)

Bri*_*ham 18

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

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

( String('hello') === String('hello') ) // returns true due to comparing strings
Run Code Online (Sandbox Code Playgroud)

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

new String('hello') === new String('hello')
Run Code Online (Sandbox Code Playgroud)

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

String('hello') === String('hello')
Run Code Online (Sandbox Code Playgroud)

  • @santoshkore:对象*是*值.它们是Object数据类型的值.不同之处在于`String()`返回*原始值*和`new String()`返回*对象值*.原始值不像对象那样唯一,它们没有ID.因此,当您比较它们时,没有什么可比较的原始数据.但每个对象都是唯一的,因此如果您比较对象,则需要比较它们的身份. (4认同)
  • 对其他人:注意在这个答案的字符串比较中缺少一个`new`关键字. (3认同)

Bey*_*ios 12

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

相关文章:JavaScript中的'new'关键字是什么?其(广泛)答案解释如下:

它[新]是4件事:

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

  • 虽然此链接可能会回答这个问题,但最好在此处包含答案的基本部分并提供参考链接.如果链接的页面发生更改,则仅链接的答案可能会无效. (4认同)

cco*_*rin 8

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

例如,假设我写了一张纸,上面写着"Hello World"这个词(Paper1),我哥哥的另一张纸上写着"Hello World"这个词(Paper2).

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

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

  • 我喜欢这个比喻,+ 1 (2认同)

Cod*_*ody 6

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

(new Object()) === (new Object());
==> false
Run Code Online (Sandbox Code Playgroud)

" " 中的任何"对象"结构都是唯一的;

堆与堆栈


小智 5

另外,如果您执行if({{hello:1} === {hello:1}){console.log(“ yay”); } console.log永远不会发生,因为它是一个对象。

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

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

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

是真的。

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


Dav*_*rby 5

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