1.用typeof操作符來(lái)獲取對(duì)象類(lèi)型,返回值總是一個(gè)字符串
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'
特別注意null的類(lèi)型是object,Array的類(lèi)型也是object,如果我們用typeof將無(wú)法區(qū)分出null、Array和通常意義上的object——{}。
2.包裝對(duì)象 熟悉Java的小伙伴肯定很清楚int和Integer這種曖昧關(guān)系
number、boolean和string都有包裝對(duì)象。沒(méi)錯(cuò),在JavaScript中,字符串也區(qū)分string類(lèi)型和它的包裝類(lèi)型。包裝對(duì)象用new創(chuàng)建:
var n = new Number(123); // 123,生成了新的包裝類(lèi)型
var b = new Boolean(true); // true,生成了新的包裝類(lèi)型
var s = new String('str'); // 'str',生成了新的包裝類(lèi)型
雖然包裝對(duì)象看上去和原來(lái)的值一模一樣,顯示出來(lái)也是一模一樣,但他們的類(lèi)型已經(jīng)變?yōu)閛bject了!所以,包裝對(duì)象和原始值用===比較會(huì)返回false:
所以閑的蛋疼也不要使用包裝對(duì)象!尤其是針對(duì)string類(lèi)型?。?!
如果我們?cè)谑褂肗umber、Boolean和String時(shí),沒(méi)有寫(xiě)new會(huì)發(fā)生什么情況?
此時(shí),Number()、Boolean和String()被當(dāng)做普通函數(shù),把任何類(lèi)型的數(shù)據(jù)轉(zhuǎn)換為number、boolean和string類(lèi)型(注意不是其包裝類(lèi)型):
總結(jié)一下,有這么幾條規(guī)則需要遵守:
不要使用new Number()、new Boolean()、new String()創(chuàng)建包裝對(duì)象;
用parseInt()或parseFloat()來(lái)轉(zhuǎn)換任意類(lèi)型到number;
用String()來(lái)轉(zhuǎn)換任意類(lèi)型到string,或者直接調(diào)用某個(gè)對(duì)象的toString()方法;
通常不必把任意類(lèi)型轉(zhuǎn)換為boolean再判斷,因?yàn)榭梢灾苯訉?xiě)if (myVar) {...};
typeof操作符可以判斷出number、boolean、string、function和undefined;
判斷Array要使用Array.isArray(arr);
判斷null請(qǐng)使用myVar === null;
判斷某個(gè)全局變量是否存在用typeof window.myVar === 'undefined';
函數(shù)內(nèi)部判斷某個(gè)變量是否存在用typeof myVar === 'undefined'。
任何對(duì)象都有toString()方法嗎?null和undefined就沒(méi)有!確實(shí)如此,這兩個(gè)特殊值要除外,雖然null還偽裝成了object類(lèi)型。
number對(duì)象調(diào)用toString()報(bào)SyntaxError:
123.toString(); // SyntaxError
遇到這種情況,要特殊處理一下:
123..toString(); // '123', 注意是兩個(gè)點(diǎn)!
(123).toString(); // '123'