Why does new String('hello') === new String('hello') evaluate to False?
为什么下面的语句在javascript中返回false?
1 | new String('hello') === new String('hello') |
两个字符串对象总是不相等的。请注意,javascript具有字符串原语值以及用于创建包装对象的字符串构造函数。所有对象相等比较(尤其是与
因此,
您正在比较对象实例,这与字符串比较(
比较字符串值而不是对象实例-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给出的链接完美地解释了新功能,希望它能有所帮助。