三種“類型判斷”的方法,一起手寫instanceof方法的實(shí)現(xiàn)原理
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
在Javascript中,有三種常用的方法用于判斷數(shù)據(jù)類型: 1. typeof操作符typeof操作符是最常用的判斷數(shù)據(jù)類型的方法之一。它是一個(gè)一元操作符,可以用于判斷一個(gè)值的數(shù)據(jù)類型,并返回一個(gè)表示該數(shù)據(jù)類型的字符串。常見的typeof返回值有: - "undefined": 用于表示未定義的變量 例如: typeof undefined; // "undefined" typeof 42; // "number" typeof "hello"; // "string" typeof true; // "boolean" typeof { name: "John" }; // "object" typeof function() {}; // "function" typeof 123n; // "bigint" typeof symbol('hello'); //"symbol" 需要注意的是,typeof對于null的判斷返回的是"object",這是因?yàn)樵贘avascript的早期版本中,null被錯(cuò)誤地認(rèn)為是一個(gè)對象。而對于函數(shù)類型,則返回"function". 2. instanceof操作符instanceof操作符用于判斷一個(gè)對象是否屬于某個(gè)構(gòu)造函數(shù)的實(shí)例。它比typeof更適用于判斷對象類型,因?yàn)樗梢詼?zhǔn)確地判斷多層原型鏈中的實(shí)例關(guān)系。例如: var arr = []; var date = new Date(); var obj = {}; var fn = function(){};
arr instanceof Array; // true date instanceof Date; // true obj instanceof Object; // true fn instanceof Function; // true instanceof判斷的結(jié)果是一個(gè)布爾值,如果對象是指定構(gòu)造函數(shù)的實(shí)例,則返回true,否則返回false。 同時(shí),也正是因?yàn)閕nstanceof操作符可以判斷多層原型鏈中的實(shí)例關(guān)系,那函數(shù)和數(shù)組不也可以看作是一個(gè)對象嗎,那用他們用instanceof操作符來判斷和Object的關(guān)系,是不是也能得到true呢,我們來看一看: var arr = []; var fn = function(){}; arr instanceof Object; // true fn instanceof Object; // true 結(jié)果也是true,欸, 這時(shí)候我們不妨先來大膽猜測一波,我們都知道,arr數(shù)組的創(chuàng)建實(shí)際是通過new構(gòu)造函數(shù)Array()得到的,那arr就是構(gòu)造函數(shù)Array()的一個(gè)實(shí)例對象,所以當(dāng)我們判斷 //L 實(shí)例對象 //R 要判斷的數(shù)據(jù)類型 function instanceOF(L,R){ while(L !== null){ // 用實(shí)例對象的__proto__屬性和要判斷的數(shù)據(jù)類型的prototype進(jìn)行判斷 //相等返回true,不相等再用實(shí)例對象的__proto__的__proto__屬性去判斷 //直到L.__proto__.__proto__...為null,就通過原型鏈根本找不到相等的了,返回false. if(L.__proto__ === R.prototype){ return true } else L = L.__proto__ } return false } //驗(yàn)證我們手寫的instanceOF是否正確 console.log(instanceOF([],Array)); //true console.log(instanceOF([],Object));//true 所以,搞明白之后,是不是覺得手寫instanceof方法非常簡單啦!好,那既然數(shù)組,函數(shù)用instanceof方法和object數(shù)據(jù)類型進(jìn)行判斷都為true,所以這種方法好像也不是那么完美,并不能精準(zhǔn)判斷對象的類型。那我們不妨看看下面另一種方法。 3. Object.prototype.toString方法Object.prototype.toString是一個(gè)通用的方法,可以返回一個(gè)對象的內(nèi)部屬性[[Class]]的值,從而判斷對象的類型。toString方法被重寫,并通過不同的內(nèi)部屬性來標(biāo)識(shí)不同的類型。例如: Object.prototype.toString.call(undefined); // "[object Undefined]" Object.prototype.toString.call(42); // "[object Number]" Object.prototype.toString.call("hello"); // "[object String]" Object.prototype.toString.call(true); // "[object Boolean]" Object.prototype.toString.call({ name: "John" }); // "[object Object]" Object.prototype.toString.call(function() {}); // "[object Function]" 這時(shí)小伙伴要問啦,不是講 console.log(Object.prototype.toString(undefined))// "[object Object]" console.log(Object.prototype.toString(42))// "[object Object]" console.log(Object.prototype.toString("hello"))// "[object Object]" 這時(shí)會(huì)發(fā)現(xiàn)結(jié)果都是
該文章在 2023/11/27 11:58:52 編輯過 |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |