为什么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件事情:
- 它创build一个新的对象。 这个对象的types,仅仅是对象 。
- 它将这个新对象的内部不可访问的[[prototype]]属性设置为构造函数的外部可访问原型对象(每个函数对象都自动具有原型属性)。
- 它执行构造函数,使用新创build的对象,每当提到
this
一点。- 它返回新创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给出的链接完全解释了新的做法,希望它会有所帮助。
你的代码基本上是说:“拿一张纸,写上'你好',再拿一张纸写'你好',它们是同一张纸吗?