关于javascript:为什么new string(“hello”)===new string(“hello”)的值为false?

Why does new String('hello') === new String('hello') evaluate to False?

本问题已经有最佳答案,请猛点这里访问。

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

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


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

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


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

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

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

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

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

严格比较两个字符串-真、返回值相同和返回类型相同

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


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

相关帖子:javascript中的"new"关键字是什么?这在其(广泛的)答案中解释了:

It [new] is 4 things:

  • It creates a new object. The type of this object, is simply object.
  • It sets this new object's internal, inaccessible, [[prototype]] property to be the constructor function's external, accessible,
    prototype object (every function object automatically has a prototype property).
  • It executes the constructor function, using the newly created object whenever this is mentioned.
  • It returns the newly created object, unless the constructor function returns a non-primitive value. In this case, that
    non-primitive value will be returned.

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

    例如,假设我有一张写着"你好世界"的纸(纸1),我弟弟有一张写着"你好世界"的纸(纸2)。

    当你说is paper1==paper2时,你会得到错误的答案,因为它们不是完全相同的一张纸,即使纸上写的字是相同的。

    如果你在哪里说paper1.toString()==paper2.toString(),你会得到正确的答案,因为我们是在比较写在纸上的单词,而不是实际的纸本身。


    1
    2
    3
    4
    5
    typeof(new String()) === 'object';
    ==> true

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

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

    堆与栈


    你的代码基本上是说"拿一张纸在上面写上‘你好’。再拿一张纸在上面写上"你好"。它们是同一张纸吗?"


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

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

    但如果javascript不为您做这件事,那是因为它非常重,您需要检查每种属性的类型,以便在它是一个函数等的情况下将其串接起来。很明显,这样做是没有用的。

    如果要检查两个对象"origins",可以使用instanceof,因为typeof将返回"object"。对于测试2个"新字符串"对象,必须使用ToStringnew string("hello").toString()==new string("hello").toString())或者如果您想在不测试属性的情况下检查对象new string("hello")string实例&;new string("hello")string实例

    是真的。

    Beylerstudios给出的链接完美地解释了新功能,希望它能有所帮助。