为什么将显式调用的String
构造函数与隐式字符串进行比较评估true
,但添加new
关键字会使其在深度等于false
上进行评估,但是{{ 1}}再次浅层等于?
true
编辑:在进一步测试后,所有具有隐式构造函数的类型都会出现这种情况。
编辑2:澄清一下,这不是> "hello"===String("hello")
true
> "hello"==new String("hello")
true
> "hello"===new String("hello")
false
与==
的问题,而是隐式与显式构造函数之一。
答案 0 :(得分:5)
使用new
关键字时,您正在创建对象。如果您要检查new String('hello')
的类型,则会看到它的类型为object
。单独检查'hello'
的类型将产生string
。
如您所知,使用严格的等于运算符(===
)将检查值和类型,因此由于类型不匹配而返回false。
没有new
关键字的表达式返回true的原因是因为调用String
全局对象是not the same as calling the constructor using new
:
字符串文字(用双引号或单引号表示)和非构造函数上下文中String调用返回的字符串(即不使用new关键字)是原始字符串。
因此,返回值的类型将为string
而不是object
,因此严格检查将返回true。
答案 1 :(得分:1)
==
和===
之间的区别在于===
要求类型相同,而==
则不需要。
因此,这告诉您"hello"
和String("hello")
属于同一类型(string
);但new String("hello")
虽然具有相同的值,但却是一种不同的类型(object
)