第一種方式也是最常見的方式,用type of判斷:console.log(type of data)朵逝,typeof檢測基本類型是沒有問題的蔚袍,如字符串、數(shù)值配名、布爾和undefined啤咽,但是如果檢測對象或null的話都會返回‘object’;
第二種方式,用 instanceof 判斷渠脉,注意此方法后面一定是數(shù)據(jù)類型:console.log(data instanceof Array)闰蚕,通常我們并不是想知道某個值是對象,而是想知道它是什么類型的對象连舍,如上:變量data是Array類型的對象没陡?;?
注意:所有引用類型值都是object的實例,所以在檢測一個引用類型值和Object構(gòu)造函數(shù)時索赏,instanceof操作符會一直返回true盼玄。如用instanceof操作符檢測基本類型值時潜腻,會一直返回false埃儿,原因很簡單,因為基本類型不是對象融涣。
第三種方式童番,用constructor判斷:console.log(data.constructor === Array);
第四種方式,用Object.prototype.toString.call(data);此種方式可以準(zhǔn)確的判斷出數(shù)據(jù)類型威鹿。
console.log(Object.prototype.toString.call(data));
原理:
1剃斧、在JavaScript中,一切皆為對象忽你,強制將變量轉(zhuǎn)換成為字符串幼东,使它暴露出內(nèi)部的[[class]]屬性科雳。
2根蟹、首先獲取對象內(nèi)部屬性[[class]](每個對象都有屬于自己的[[class]]),然后根據(jù)這個屬性返回一個類似于"[object Number]"的字符串作為結(jié)果糟秘,? ? ([[]]用來表示語言內(nèi)部用到的简逮,外部不可直接訪問的屬性,稱之為內(nèi)部屬性尿赚。)散庶。利用此方法并且配合call方法可以取得任何對象內(nèi)部屬性的[[class]]沛婴,然后把類型檢測轉(zhuǎn)化為字符串比較,以此來判斷數(shù)據(jù)類型督赤。