2017-01-30 43 views
1

为什么要将显式调用String构造函数与隐式字符串求值true进行比较,但是添加new关键字使其在深等于上评估false,但true又等于浅等于?这为什么评价为错误?

> "hello"===String("hello") 
true 
> "hello"==new String("hello") 
true 
> "hello"===new String("hello") 
false 

编辑:后进一步测试,这似乎与具有隐含的构造函数所有类型的发生。

编辑2:澄清,这不是=====的问题,但隐含的对显示的构造函数中的一个。

+4

'的typeof “你好”'→' 'string'','typeof运算新字符串( “你好”)'→'' object'' – Biffen

+1

''==只为值检查(' “4” == 4 > true'),但'==='也检查类型。 ('“4”=== 4> false'),因为一个是字符串,另一个是数字。 –

+0

@ibrahimmahrir:他们都检查类型。如果发现类型不一样,那么'=='会输入一个类型强制算法。如果'=='只检查了这个值,那么'4 ==“4”'就是'false'。 –

回答

5

当您使用new关键字您正在创建一个对象。如果您要检查new String('hello')的类型,您将会看到它的类型为object。单独检查'hello'的类型将产生string。如您所知,使用严格的等号运算符(===)将检查值和类型,所以它将因类型不匹配而返回false。

没有new关键字的表达式返回true的原因是因为呼吁String全局对象是not the same as calling the constructor using new

字符串(双或单引号表示)和字符串从字符串返回调用非-constructor上下文(即,不使用新的关键字)是原始字符串。

因此,返回值的类型将是string而不是object,因此严格检查将返回true。

1

=====之间的差异是===要求类型相同,而==不要。

因此,这是告诉你,无论"hello"String("hello")是同一类型的(这是string);但new String("hello"),虽然它具有相同的值,是不同的类型(它是object