摘要:這是一個出現(xiàn)過無數(shù)次的話題,這里再次重寫僅作為個人的學(xué)習(xí)筆記,謝謝觀看。
這是一個出現(xiàn)過無數(shù)次的話題,這里再次重寫僅作為個人的學(xué)習(xí)筆記,謝謝觀看。
0、typeoftypeof 運算符的主要作用就是用來檢測數(shù)據(jù)的類型,一般情況下我們都是使用它來判斷數(shù)據(jù)類型,但是這里,我把typeof 放在0的位置,因為 typeof 不能檢測到數(shù)組類型!typeof 所能識別的類型只有原始類型(Undefined,Null,Boolean,Number,String,Symbol )以及 function 和 object。
需要注意的是null,null所檢測出來的結(jié)果是"object",因為在js中,null除了作為空引用的存在,它也是對象整個原型鏈上最頂端的存在,即
Object.prototype.__proto__ === null;//true
其他使用typeof的場景:
// Numbers typeof 3.14 === "number"; typeof Math.LN2 === "number"; typeof Infinity === "number"; typeof NaN === "number"; //盡管NaN是"Not-A-Number"的縮寫 // Strings typeof "bla" === "string"; typeof (typeof 1) === "string"; //typeof總是返回一個字符串 // Booleans typeof true === "boolean"; // Symbols typeof Symbol() === "symbol"; typeof Symbol.iterator === "symbol"; // Undefined typeof undefined === "undefined"; // null typeof null === "object";//從一開始出現(xiàn)JavaScript就是這樣的 // function typeof function(){} === "function"; typeof class C{} === "function" // Objects typeof {a:1} === "object"; // 下面的結(jié)果是什么? typeof new Boolean(true) === "object"; typeof new Number(1) === "object"; typeof new String("abc") === "object"; //new 所創(chuàng)建的都是對象,賦值給變量是執(zhí)行了內(nèi)部valueOf()或者toString()函數(shù)
最后,typeof不能檢測到數(shù)組類型!
1、驗證原型對象:從原型鏈上尋找(認祖歸宗)
1、Object.getPrototypeOf(obj) == Array.prototype
getPrototypeOf: 這是Object自帶的一個API,作用是獲取一個對象的原型對象
2、var bool = Array.prototype.isPrototypeOf(obj)
每個對象都有一個isPrototypeOf的API,繼承自O(shè)bject.prototype,用來 判斷father(Array)是否是child(obj)的父對象
2、驗證構(gòu)造函數(shù):從構(gòu)造函數(shù)上判斷(它的親娘)
1、obj.constructor == Array
構(gòu)造函數(shù)的prototype指向原型對象,同時,原型對象有constructor指回構(gòu)造函數(shù)對象,constructor只在原型對象上有
2、var bool = obj instanceof Array
instance: 判斷對象(obj)是否由構(gòu)造函數(shù)(Array)創(chuàng)建出來
這種方法有一個問題,就是驗證不夠嚴格。 即使對象創(chuàng)建時不是使用數(shù)組創(chuàng)建的,但是只要原型鏈上有數(shù)組類型,也認為是數(shù)組,如下面一段代碼:
function Test(){} Test.prototype = Array.prototype; let test = new Test(); test instanceof Array;//true3、檢查內(nèi)部屬性class + call或apply:
這個class不是es6中對象聲明的class
這個class是每個對象中記錄對象創(chuàng)建時使用的類型的屬性,一旦對象被創(chuàng)建,class屬性就無法被修改!
獲得class的唯一的辦法就是調(diào)用Object.prototype中的toString()方法
輸出結(jié)果有"[object Object]","[object Function]"等
問題: 幾乎所有內(nèi)置對象的原型對象都重寫了Object中的toString方法,所有內(nèi)置對象的子對象,都無法直接調(diào)到Object的toString。
let arr = [1]; arr.toString();//"1" let date = new Date(); date.toString();//"Wed Mar 07 2018 16:22:16 GMT+0800 (中國標(biāo)準(zhǔn)時間)"
雖然直接使用不行,但是我們可以利用js的call和apply函數(shù)來解決這個問題
Object.prototype.toString.call(obj)=="[object Array]"
使用這個方法判斷其他類型:
console.log(Object.prototype.toString.call("jerry"));//[object String] console.log(Object.prototype.toString.call(12));//[object Number] console.log(Object.prototype.toString.call(true));//[object Boolean] console.log(Object.prototype.toString.call(undefined));//[object Undefined] console.log(Object.prototype.toString.call(null));//[object Null] console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object] console.log(Object.prototype.toString.call(function(){}));//[object Function] console.log(Object.prototype.toString.call([]));//[object Array] console.log(Object.prototype.toString.call(new Date));//[object Date] console.log(Object.prototype.toString.call(/d/));//[object RegExp] function Person(){}; console.log(Object.prototype.toString.call(new Person));//[object Object]4、ES5中的API:Array.isArray(obj)
這是ES5出的一個API,專門用來判斷一個對象是不是數(shù)組的,所以,看到這里有沒有感覺前面都白看了....
他的用法也很簡單:
var arr = [1,2,3,4]; Array.isArray(arr);//true寫在最后
如果文中有什么錯誤的地方,還請大家給予指出,另外大家如果還有什么別的方法的話,也可以在評論區(qū)寫下或私信我,大家集思廣益,相互學(xué)習(xí),共同進步。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/93237.html
摘要:雖然今年沒有換工作的打算但為了跟上時代的腳步還是忍不住整理了一份最新前端知識點知識點匯總新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式和的區(qū)別使用的好處標(biāo)簽廢棄的標(biāo)簽,和一些定位寫法放置位置和原因什么是漸進式渲染模板語言原理盒模型,新特性,偽 雖然今年沒有換工作的打算 但為了跟上時代的腳步 還是忍不住整理了一份最新前端知識點 知識點匯總1.HTMLHTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪...
摘要:雖然今年沒有換工作的打算但為了跟上時代的腳步還是忍不住整理了一份最新前端知識點知識點匯總新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式和的區(qū)別使用的好處標(biāo)簽廢棄的標(biāo)簽,和一些定位寫法放置位置和原因什么是漸進式渲染模板語言原理盒模型,新特性,偽 雖然今年沒有換工作的打算 但為了跟上時代的腳步 還是忍不住整理了一份最新前端知識點 知識點匯總1.HTMLHTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪...
摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒有換工作的打算 但為了跟上時代的腳步 還是忍不住整理了一份最新前端知識點 知識點匯總 1.HTML HTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫法css js放置位置和原因...
摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒有換工作的打算 但為了跟上時代的腳步 還是忍不住整理了一份最新前端知識點 知識點匯總 1.HTML HTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫法css js放置位置和原因...
摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒有換工作的打算 但為了跟上時代的腳步 還是忍不住整理了一份最新前端知識點 知識點匯總 1.HTML HTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫法css js放置位置和原因...
閱讀 1165·2021-09-22 15:43
閱讀 2361·2021-09-22 15:32
閱讀 4533·2021-09-22 15:11
閱讀 2236·2019-08-30 15:55
閱讀 2603·2019-08-30 15:54
閱讀 997·2019-08-30 15:44
閱讀 1110·2019-08-29 13:26
閱讀 808·2019-08-29 12:54