为什么以下语句在JavaScript中返回false?
new String('hello') === new String('hello')
答案 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件事:
- 它会创建一个新对象。此对象的类型只是 object 。
- 它将此新对象的内部,不可访问的 [[prototype]] 属性设置为构造函数的外部,可访问, prototype 对象(每个函数对象都自动拥有 prototype 属性)。
- 只要提到
this
,它就会使用新创建的对象执行构造函数。- 它返回新创建的对象,除非构造函数返回非原始值。在这种情况下,那 将返回非原始值。
醇>
答案 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”中的任何“对象”结构都是唯一的;
答案 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)
你的代码基本上是说“拿一张纸在上面写'你好'。拿另一张纸然后写上'你好'。它们是同一张纸吗?”