1.JavaScript中的數(shù)據(jù)類型
JavaScript的數(shù)據(jù)類型分為兩類:原始類型肴颊、引用類型荞驴,二者在內(nèi)存中的存儲(chǔ)位置不同承匣。
原始類型
原始類型也叫基本類型充尉。有5種基本類型的數(shù)據(jù),分別是:number只盹、string亿卤、boolean、null鹿霸、undefined。在ES6中還新增了Symbol秆乳。原始類型存儲(chǔ)在內(nèi)存棧中懦鼠,也就是說直接存儲(chǔ)的變量的值
引用數(shù)據(jù)
除了6種原始類型外钻哩,都是引用類型。主要有:Object肛冶、Array街氢、Date、Error睦袖、RegExp珊肃、Function。在ES6種還新增了Promise馅笙、Map伦乔。引用類型的值是存儲(chǔ)在內(nèi)存堆中的的。也就是說直接存儲(chǔ)的變量的值是一個(gè)指向原對(duì)象的內(nèi)存指針董习。
3.原始數(shù)據(jù)的檢測(cè)
檢測(cè)原始類型時(shí)烈和,都可以使用typeof操作符檢測(cè)。typeof檢測(cè)后會(huì)返回一個(gè)表示檢測(cè)對(duì)象類型的字符串
使用typeof進(jìn)行原始類型檢測(cè)時(shí)皿淋,其返回值分別為:
- Number類型返回'number'
- String類型返回'string'
- Boolean類型返回'boolean'
- Undefined類型返回'undefined'
- Null類型返回'null'
- Symbol類型返回'symbol'
局限性:不能具體的細(xì)分是數(shù)組還是正則招刹,還是對(duì)象中的其他值。對(duì)于對(duì)象數(shù)據(jù)類型返回都是object
4.引用數(shù)據(jù)類型的檢測(cè)
instanceof方法
檢測(cè)某一個(gè)實(shí)例是否屬于某一個(gè)類
具體用法:
- [] instanceof Array; //true
局限性
對(duì)于基本數(shù)據(jù)類型窝趣,字面量方式創(chuàng)建的結(jié)果和實(shí)例創(chuàng)建出來(lái)的結(jié)果是有區(qū)別的疯暑,從嚴(yán)格意義山來(lái)講,從實(shí)例創(chuàng)建方式出來(lái)的結(jié)果才是標(biāo)準(zhǔn)的對(duì)象數(shù)據(jù)類型哑舒,也是各種基本數(shù)據(jù)類型類的實(shí)例
- 不能用來(lái)檢測(cè)和處理字面量方式創(chuàng)建出來(lái)的基本數(shù)據(jù)類型
- 只要在當(dāng)前實(shí)例的原型鏈上妇拯,就會(huì)用其檢測(cè)出來(lái)的結(jié)果都是true
- 在類的原型繼承中,我們用其檢測(cè)出來(lái)的結(jié)果未必準(zhǔn)確
constructor:構(gòu)造函數(shù)(不常用)
- 可以處理基本數(shù)據(jù)類型的檢測(cè)
局限性:我們可以把類的原型重寫散址,再重寫的過程中很可能出現(xiàn)把原來(lái)的原型覆蓋掉乖阵,這時(shí)檢測(cè)就不準(zhǔn)確了
Object.prototype.toString.call(val);
最準(zhǔn)確的方法。Object.prototype.toString它的作用是返回當(dāng)前方法的執(zhí)行主體(方法中的this)所屬類的詳細(xì)信息
具體用法:
- Object.prototype.toString.call([]);//'[object Array]';
- 返回的是一個(gè)'[object Array]'预麸。中括號(hào)中的第一項(xiàng)永遠(yuǎn)是一個(gè)小寫的object瞪浸。因?yàn)閺母蟻?lái)說,任何數(shù)據(jù)類型都都是一個(gè)對(duì)象吏祸。第二項(xiàng)表示當(dāng)前要檢測(cè)的數(shù)據(jù)对蒲,是一個(gè)首字母大寫的數(shù)據(jù)類。
- String\Boolean\Array\RegExp\Date\Function原型上的toString()方法都已經(jīng)對(duì)Object中的toString()方法進(jìn)行了重寫贡翘,作用是把當(dāng)前的數(shù)據(jù)類型轉(zhuǎn)換為字符串的類型蹈矮。
對(duì)象屬性檢測(cè)
檢測(cè)對(duì)象屬性時(shí),可以使用in運(yùn)算符鸣驱,或者使用對(duì)象的實(shí)例方法hasOwnProperty()泛鸟。前者不僅可以檢測(cè)屬性是否屬于該對(duì)象,還可以檢測(cè)該對(duì)象的原型鏈中的方法或?qū)傩允欠駥儆谠搶?duì)象踊东。而后者只檢測(cè)該對(duì)象的私有屬性和方法北滥,不會(huì)去判斷原型鏈中的屬性和方法刚操。
事例:
for(var key in obj){
if(obj.hasOwnProterty(key)){
//表明屬于該對(duì)象的私有屬性 和方法。
}
}
所以我們一般判斷屬性是否屬于該對(duì)象時(shí)再芋,使用hasOwnProperty()