2017-01-30 44 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