說明 在JavaScript 中,有五種原始型別:數值、字串、布林、null
和undefined
,除此null
和undefined
之外,其餘三種都有原始型別包覆物件 (primitive wrapper objects )。 其對應的三種包覆物件有對應的內建建構式,分別為Number()
、String()
和Boolean()
。
兩者的差異 最簡單的辨別方式 用包覆器建立的數值,型別都會是object
;直接以原始型別指派給變數的話,其變數的型別則為對應的原始型別。
1 2 3 4 5 6 7 8 9 10 11 12 13 var bool = true , num = 999 , str = "example" ; typeof bool; typeof num; typeof str; var boolObj = new Boolean (true ), numObj = new Number (999 ), strObj = new String ("example" ); typeof boolObj; typeof numObj; typeof strObj;
Boolean包覆器 你覺得下面的結果會是什麼? 提示:它用建構式,所以會是一個物件。
1 2 var boolObj = new Boolean (false );console .log (boolObj);
答案就是true
。 因為無論你放入任何初始化的直進去建構式,一定都會被new
運算子回傳一個物件。 而在js 中,物件都被視為truthy 。 換句話說,用new Boolean()
回傳的值,全部都是true
,沒有例外。
如果不用new
運算子的話,則回傳和truthy
和falsy
的分類結果一樣的對應值:
1 2 3 4 5 6 7 8 9 10 11 12 13 var boolObjArray = [ Boolean (NaN ), Boolean (Number .NEGATIVE_INFINITY ), Boolean (Number .POSITIVE_INFINITY ), Boolean (null ), Boolean (undefined ), Boolean (0 ), Boolean (4 ), Boolean ('' ), Boolean ('test' ), Boolean (true ), Boolean (false ) ];
仔細想想,這樣的用法好像跟!!
運算子很相似:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 var boolObjArray = [ Boolean (NaN ), Boolean (Number .NEGATIVE_INFINITY ), Boolean (Number .POSITIVE_INFINITY ), Boolean (null ), Boolean (undefined ), Boolean (0 ), Boolean (4 ), Boolean ('' ), Boolean ('test' ), Boolean (true ), Boolean (false ) ], originalArray = [ NaN , Number .NEGATIVE_INFINITY , Number .POSITIVE_INFINITY , null , undefined , 0 , 4 , '' , 'test' , true , false ], isSame = boolObjArray.every (function (bool, index ) { return bool === !!originalArray[index]; }); console .log (isSame);
Number包覆器 相較於Boolean()
,Number()
似乎就比較有用一些。 它的主要用途是作為數值判定和型別轉換,請參考 MDN - Number#說明 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 Number (0 ) Number (123 ) Number (Infinity ) Number (Number .POSITIVE_INFINITY ) Number (Number .NEGATIVE_INFINITY ) Number (Number .EPSILON ) Number (Number .MAX_SAFE_INTEGER ) Number (Number .MAX_VALUE ) Number (Number .MIN_SAFE_INTEGER ) Number (Number .MIN_VALUE ) Number (null ) Number ('' ) Number ('123' ) Number (new Date ('Sep 14, 2017 23:36:45' )) Number (true ) Number (false ) Number (Boolean (true )) Number (Boolean (false )) Number (Number .NaN ) Number (NaN ) Number (undefined ) Number (function ( ){}) Number ({}) Number ('123abc' ) Number (Math )
String包覆器 String()
如果傳入eval()
函式的話,要特別注意。 eval()
會把String
物件視作是一個物件包含字串,而非一個字串。 所以要使用valueOf()
或是toString()
將String
物件轉換成原始型別字串。
1 2 3 4 eval ('5 + 5' ) eval (new String ('6 + 6' )) eval (new String ('7 + 7' ).toString ()) eval (new String ('8 + 8' ).valueOf ())
簡單一點,其實可以多加上原始型別字串,這樣也能達到一樣的效果。
1 eval (new String ('8 + 8' ) + '8' )
結論
使用new
運算子,在typeof
的結果都會是object
;反之,都會是自身的原始型別(boolean
、number
、string
)。
使用Boolean()
時,不要用new
運算子。
Boolean()
和!!
運算子功能相似,目的是要將物件轉換成布林值。
Number()
主要功能是將可轉換成數值的物件轉換成數值,否則回傳NaN
物件。
Number()
可將Date
物件轉換成時間戳記。
String()
在使用時,要注意在eval()
中,需要做原始型別字串的轉換,否則會達不到預期的結果。