標籤:keyword 擷取 regex ring Null 字元串 字元 對象 obj boolean
在JavaScript的世界裡,一切都是對象。
但是某些對象還是和其他對象不太一樣。為了區分對象的類型,我們用typeof
操作符擷取對象的類型,它總是返回一個字串:
typeof 123; // ‘number‘typeof NaN; // ‘number‘typeof ‘str‘; // ‘string‘typeof true; // ‘boolean‘typeof undefined; // ‘undefined‘typeof Math.abs; // ‘function‘typeof null; // ‘object‘typeof []; // ‘object‘typeof {}; // ‘object‘
可見,number
、string
、boolean
、function
和undefined
有別於其他類型。特別注意null
的類型是object
,Array
的類型也是object
,如果我們用typeof
將無法區分出null
、Array
和通常意義上的object——{}
。
封裝對象
JavaScript還提供了封裝對象,熟悉Java的小夥伴肯定很清楚int
和Integer
這種曖昧關係。
number
、boolean
和string
都有封裝對象。沒錯,在JavaScript中,字串也區分string
類型和它的封裝類型。封裝對象用new
建立:
var n = new Number(123); // 123,產生了新的封裝類型var b = new Boolean(true); // true,產生了新的封裝類型var s = new String(‘str‘); // ‘str‘,產生了新的封裝類型
雖然封裝對象看上去和原來的值一模一樣,顯示出來也是一模一樣,但他們的類型已經變為object
了!所以,封裝對象和原始值用===
比較會返回false
:
所以閑的蛋疼也不要使用封裝對象!尤其是針對string
類型!!!
如果我們在使用Number
、Boolean
和String
時,沒有寫new
會發生什麼情況?
此時,Number()
、Boolean
和String()
被當做普通函數,把任何類型的資料轉換為number
、boolean
和string
類型(注意不是其封裝類型):
var n = Number(‘123‘); // 123,相當於parseInt()或parseFloat()typeof n; // ‘number‘var b = Boolean(‘true‘); // truetypeof b; // ‘boolean‘var b2 = Boolean(‘false‘); // true! ‘false‘字串轉換結果為true!因為它是非Null 字元串!var b3 = Boolean(‘‘); // falsevar s = String(123.45); // ‘123.45‘typeof s; // ‘string‘
總結一下,有這麼幾條規則需要遵守:
不要使用new Number()
、new Boolean()
、new String()
建立封裝對象;
用parseInt()
或parseFloat()
來轉換任意類型到number
;
用String()
來轉換任意類型到string
,或者直接調用某個對象的toString()
方法;
通常不必把任意類型轉換為boolean
再判斷,因為可以直接寫if (myVar) {...}
;
typeof
操作符可以判斷出number
、boolean
、string
、function
和undefined
;
判斷Array
要使用Array.isArray(arr)
;
判斷null
請使用myVar === null
;
判斷某個全域變數是否存在用typeof window.myVar === ‘undefined‘
;
函數內部判斷某個變數是否存在用typeof myVar === ‘undefined‘
。
最後有細心的同學指出,任何對象都有toString()
方法嗎?null
和undefined
就沒有!確實如此,這兩個特殊值要除外,雖然null
還偽裝成了object
類型。
更細心的同學指出,number
對象調用toString()
報SyntaxError:
123.toString(); // SyntaxError
遇到這種情況,要特殊處理一下:
123..toString(); // ‘123‘, 注意是兩個點!(123).toString(); // ‘123‘
js 標準對象