JS中四種數(shù)據(jù)類型檢測

1、typeof [val]:用來檢測數(shù)據(jù)類型的運(yùn)算符

2、instanceof :用來檢測當(dāng)前實(shí)例是否率屬于某個(gè)類

3、constructor : 基于構(gòu)造函數(shù)檢測數(shù)據(jù)類型(也是基于類的方式)

4、Object.prototype.toString.call() :檢測數(shù)據(jù)類型最好的辦法

一、typeof

typeof [value]
@return 
    首先是個(gè)字符串
    字符串中包含對應(yīng)的數(shù)據(jù)類型,例如:"number"、"object"、"undefined"、"function"、"boolean"、
"symbol"...
@局限性
    typeof null  =>"object"
    不能具體區(qū)分對象數(shù)據(jù)類型的值(無法檢測是正則還是數(shù)組等)
    typeof []    =>"object"
    typeof {}    =>"object"
    typeof /^$/  =>"object"
@優(yōu)勢
    使用方便,所以在真實(shí)項(xiàng)目中,我們也會(huì)大量應(yīng)用它來檢測,尤其是在檢測基本類型值(除null之外)和函數(shù)類型
值的時(shí)候,它還是很方便的
 function func(n, m, callback) {
 /*形參賦值默認(rèn)值*/ 
//=>ES6: func(n = 0, m = 0)
//=>檢測形參的值是否為UNDEFINED
// n === undefined ? n = 0 : null;
// typeof m === "undefined" ? m = 0 : null;
//=>基于邏輯或和邏輯與處理(瑕疵:不僅僅是不傳賦值默認(rèn)值,如果傳遞的值是假也會(huì)處理成為默認(rèn)值)
// n = n || 0;
// m = m || 0;

/* 回調(diào)函數(shù)執(zhí)行 */
        // typeof callback === "function" ? callback() : null;
        // callback && callback(); //=>瑕疵:傳遞的為真即可執(zhí)行,不一定是一個(gè)函數(shù),這樣寫是開發(fā)者心里
    已經(jīng)知道,要不然不傳,要傳就是一個(gè)函數(shù)
    }
    func(10, 20, function anonymous() {}); */

二、instanceof

instanceof:本意是用來檢測實(shí)例是否隸屬于某個(gè)類的運(yùn)算符,我們基于這樣的方式,也可以用來做某些數(shù)據(jù)類型
    的檢測,例如:數(shù)組、正則等
        @局限性
            不能處理基本數(shù)據(jù)類型值,只要在當(dāng)前實(shí)例的原型鏈(proto)中出現(xiàn)過的類,檢測結(jié)果都是true(用戶可能會(huì)手
      動(dòng)修改原型鏈的指向:example.proto 或者 在類的繼承中 等情況)
    
function func() {
    arguments:類數(shù)組
    arguments.proto = Array.prototype;
    console.log(arguments instanceof Array); //=>true
}
func();
let arr = [],
    reg = /^$/,
    obj = {};
    // console.log(arr instanceof Array); //=>true
    // console.log(reg instanceof Array); //=>false
    // console.log(arr instanceof Object); //=>true
    // console.log(obj instanceof Array); //=>false
    // console.log(1 instanceof Number); //=>false
    
//=>創(chuàng)建值的兩種方式(不管哪種方式都是所屬類的實(shí)例)
//字面量:let n = 12;
//構(gòu)造函數(shù):let m = new Number('12');

三、constructor

constructor:構(gòu)造函數(shù) 
    @原理:在類的原型上一般都會(huì)帶有constructor屬性,存儲(chǔ)當(dāng)前類本身,我們也是利用這一點(diǎn),獲取某的實(shí)例
constructor屬性值,驗(yàn)證是否為所屬的類,從而進(jìn)行數(shù)據(jù)類型檢測
    @局限性:constructor屬性值容易被修改

    let n = 12,
        arr = [];
    // console.log(n.constructor === Number); //=>true
    // console.log(arr.constructor === Array); //=>true
    // console.log(arr.constructor === Object); //=>false
    
    // arr.constructor = 111; //=>設(shè)置私有屬性
    // console.log(arr.constructor === Array); //=>false
    // Func.prototype={}; //=>這樣原型上就沒有constructor屬性,因?yàn)楸恢貥?gòu)了,有需要需手動(dòng)添加

四、Object.prototype.toString.call([value])

    Object.prototype.toString.call([value]):調(diào)用Object原型上的toString方法,讓方法執(zhí)行的時(shí)候,
方法中的this是要檢測的數(shù)據(jù)類型 ,從而獲取到數(shù)據(jù)類型所屬類的詳細(xì)信息
    @信息的模板
        "[object 所屬類]" ,例如:"[object Array]"

    在所有的數(shù)據(jù)類型類中,它們的原型上都有toString方法,除Object.prototype.toString不是把數(shù)據(jù)值轉(zhuǎn)換為
字符串,其余的都是轉(zhuǎn)為字符串,而Object原型上的toString是檢測當(dāng)前實(shí)例隸屬類的詳細(xì)信息的(檢測數(shù)據(jù)類型)
    
    obj.toString()
        1.首先基于原型鏈查找機(jī)制,找到Object.prototype.toString
        2.把找到的方法執(zhí)行,方法中的this -> obj
        3.方法內(nèi)部把this(obj)的所屬類信息輸出
        =>方法執(zhí)行,方法中的this是誰,就是檢測誰的所屬類信息

    這個(gè)方法很強(qiáng)大,所有數(shù)據(jù)類型隸屬的類信息檢測的一清二楚
    "[object Number]"  String/Boolean/Null/Undefined/Symbol/Object/Array/RegExp/Date/Math/Function...

let _obj = {},
    toString = _obj.toString;
    
console.log(_obj.toString.call(100)); //=>"[object Number]"
console.log(Object.prototype.toString.call(100)); //=>"[object Number]"

function func(n, m) {
    return n + m;
}

let obj1 = {},
    obj2 = {
        name: '鄭一'
    }; 
    
console.log([12, 23].toString()); //=>"12,23"
console.log(/^\d+$/.toString()); //=>"/^\d+$/"
console.log(func.toString()); //=>"function func(n, m) {..."
console.log(obj1.toString()); //=>"[object Object]"
console.log(obj2.toString()); //=>"[object Object]"

師承——北京珠峰培訓(xùn):周嘯天

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容