JavaScript類型檢測的方法實(shí)例教程
前言
JavaScript是web前端廣泛應(yīng)用的語言之一,在網(wǎng)頁應(yīng)用制作、腳本制作、小程序等諸多領(lǐng)域具有不可替代的的地位。筆者學(xué)習(xí)了一端時(shí)間的前端,頗感JS知識點(diǎn)的繁碎,故將學(xué)習(xí)到的一些知識、思考和感悟記錄下來。
JS基本類型
JavaScript的基本類型分為原始基本類型和引用數(shù)據(jù)類型:
原始基本類型:
- number
- string
- boolean
- null
- undefined
- symbol
引用數(shù)據(jù)類型:
- Object
- Function
- Array
- Date
- RegExp
注意:ES5中沒有symbol類型
類型檢測
類型檢測有5中常見的方法:
- typeof
- instanceof
- Object.prototype.toString
- constructor
- duck type
1.typeof 判斷基本類型
使用關(guān)鍵字 typeof 返回的是類型名僅包括以下 7 種:number、string、boolean、undefined、symbol、object、function 。
null和大部分的引用類型都不能用 typeof 進(jìn)行判斷。
let num = 32 let str = "32" let bool = true let nul = null let undef = undefined let sym = Symbol() const obj = new Object() const arr = new Array() const fun = new Function() const date = new Date() const reg = new RegExp() console.log(typeof num) //number console.log(typeof str) //string console.log(typeof bool) //boolean console.log(typeof nul) //object console.log(typeof undef) //undefined console.log(typeof sym) //symbol console.log(typeof obj) //object console.log(typeof arr) //object console.log(typeof fun) //function console.log(typeof date) //object console.log(typeof reg) //object
注意:用typeof判斷null、Array、Date、RegExp等類型結(jié)果均為object
2.instanceof 判斷引用數(shù)據(jù)類型
instanceof利用的是變量的__proto__屬性指向原型的prototype屬性進(jìn)行類型判斷,需要注意的是,如果對基本數(shù)據(jù)類型使用直接賦值的方法,則__proto__屬性是不存在的,我們需要使用構(gòu)造函數(shù)。
const obj = new Object() const arr = new Array() const fun = new Function() const date = new Date() const reg = new RegExp() console.log(obj instanceof Object) //true console.log(arr instanceof Array) //true console.log(fun instanceof Function) //true console.log(date instanceof Date) //true console.log(reg instanceof RegExp) //true let num1 = 32 let num2 = new Number(32) console.log(num1 instanceof Number) //false console.log(num2 instanceof Number) //true
另外,雖然 instanceof 能夠判斷出arr是Array的實(shí)例,但它認(rèn)為也是Object的實(shí)例,這對判斷一個(gè)未知引用類型并不友好。
const arr = new Array() console.log(arr instanceof Array) //true console.log(arr instanceof Object) //true
原因是 arr.__proto__的__proto__屬性指向Object的原型對象。
對于這種情況,可以換用 constructor 進(jìn)行判斷。
注意:不同window或iframe間的對象檢測不能使用instanceof !
3.Object.prototype.toString 判斷類型
toString() 是 Object 的原型方法,每一個(gè)繼承 Object 的對象都有 toString 方法。
所有使用 typeof 返回值為 object 的對象都包含一個(gè)內(nèi)部屬性[[class]],這個(gè)屬性無法直接訪問,一般通過Object.prototype.toString()來查看。
如果 toString 方法沒有重寫的話,默認(rèn)返回當(dāng)前對象的 [[Class]],其格式為[object Xxx],其中 Xxx 為對象的類型。但除了 Object 類型的對象外,其他類型直接使用 toString 方法時(shí),會直接返回都是內(nèi)容的字符串,所以我們需要使用call或者apply方法來改變toString方法的執(zhí)行上下文。
let num = 32 let str = "32" let bool = true let nul = null let undef = undefined let sym= Symbol() const obj = new Object() const arr = new Array() const fun = new Function() const date = new Date() const reg = new RpgExp() console.log(Object.prototype.toString.apply(num)) //"[object Number]" console.log(Object.prototype.toString.apply(str)) //"[object String]" console.log(Object.prototype.toString.apply(bool)) //"[object Boolean]" console.log(Object.prototype.toString.apply(nul)) //"[object Null" console.log(Object.prototype.toString.apply(undef)) //"[object Undefined]" console.log(Object.prototype.toString.apply(sym) //"[object Symbol]" console.log(Object.prototype.toString.call(obj)) //"[object Object]" console.log(Object.prototype.toString.call(arr)) //"[object Array]" console.log(Object.prototype.toString.call(fun)) //"[object Function]" console.log(Object.prototype.toString.call(date)) //"[object Date]" console.log(Object.prototype.toString.call(reg) //"[object RegExp]"
Object.prototype.toString可以判斷null,但習(xí)慣上我們用 null===null來判斷是否為null。
4.constructor判斷類型
constructor屬性會返回變量的構(gòu)造函數(shù),當(dāng)然也可以利用字符串截取獲取構(gòu)造函數(shù)名稱進(jìn)行判斷來獲取布爾值,如" ".constructor === String。
let num = 32
let str = "32"
let bool = true
let nul = null
let undef = undefined
let sym= Symbol()
const object = new Object()
const arr = new Array()
const fun = new Function()
const date = new Date()
const reg = new RegExp()
console.log(num.constructor) //ƒ Number() { [native code] }
console.log(str.constructor) //ƒ String() { [native code] }
console.log(bool.constructor) //ƒ Boolean() { [native code] }
console.log(nul.constructor) //Uncaught TypeError: Cannot read property 'constructor' of null
console.log(undef.constructor) //Uncaught TypeError: Cannot read property 'constructor' of undefined
console.log(sym.constructor) //ƒ Symbol() { [native code] }
console.log(obj.constructor === Object) //true
console.log(arr.constructor === Array) //true
console.log(fun.constructor === Function) //true
console.log(date.constructor === Date) //true
console.log(reg.constructor === RegExp) //true
無法用constructor判斷null和undefined,但可以避免使用instanceof時(shí)arr的原型對象既可以為Array也可以是Object。
5.duck type 利用特征來判斷類型
在程序設(shè)計(jì)中,鴨子類型(英語:duck typing)是動(dòng)態(tài)類型的一種風(fēng)格。在這種風(fēng)格中,一個(gè)對象有效的語義,不是由繼承自特定的類或?qū)崿F(xiàn)特定的接口,而是由"當(dāng)前方法和屬性的集合"決定。
“當(dāng)看到一只鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那么這只鳥就可以被稱為鴨子?!?/p>
在鴨子類型中,關(guān)注點(diǎn)在于對象的行為,能作什么;而不是關(guān)注對象所屬的類型。
例如,在不使用鴨子類型的語言中,我們可以編寫一個(gè)函數(shù),它接受一個(gè)類型為"鴨子"的對象,并調(diào)用它的"走"和"叫"方法。
隨后,在使用鴨子類型的函數(shù)中,可以接受一個(gè)任意類型的對象,并調(diào)用它的"走"和"叫"方法。如果這些需要被調(diào)用的方法不存在,那么將引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤。任何擁有這樣的正確的"走"和"叫"方法的對象都可被函數(shù)接受。
比如判斷一個(gè)對象是否是數(shù)組,可以看這個(gè)對象是否擁有push()等方法
總結(jié)
到此這篇關(guān)于JavaScript類型檢測的文章就介紹到這了,更多相關(guān)JavaScript類型檢測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JS數(shù)組索引檢測中的數(shù)據(jù)類型問題詳解
- 詳解JavaScript中的數(shù)據(jù)類型,以及檢測數(shù)據(jù)類型的方法
- javascript中的數(shù)據(jù)類型檢測方法詳解
- js數(shù)據(jù)類型檢測總結(jié)
- js學(xué)習(xí)總結(jié)_基于數(shù)據(jù)類型檢測的四種方式(必看)
- JS檢測數(shù)組類型的方法小結(jié)
- 在javaScript中檢測數(shù)據(jù)類型的幾種方式小結(jié)
- javascript基本數(shù)據(jù)類型及類型檢測常用方法小結(jié)
- JS中檢測數(shù)據(jù)類型的幾種方式及優(yōu)缺點(diǎn)小結(jié)
- JS正則表達(dá)式匹配檢測各種數(shù)值類型(數(shù)字驗(yàn)證)
- 如何檢測JavaScript的各種類型
- JavaScript類型檢測之typeof 和 instanceof 的缺陷與優(yōu)化
- JavaScript學(xué)習(xí)筆記之檢測客戶端類型是(引擎、瀏覽器、平臺、操作系統(tǒng)、移動(dòng)設(shè)備)
- Javascript實(shí)現(xiàn)檢測客戶端類型代碼封包
- JavaScript 檢測文件的類型的方法
相關(guān)文章
JS判斷來路是否是百度等搜索索引進(jìn)行彈窗或自動(dòng)跳轉(zhuǎn)的實(shí)現(xiàn)代碼
這篇文章主要介紹了JS判斷來路是否是百度等搜索索引進(jìn)行彈窗或自動(dòng)跳轉(zhuǎn)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-10-10
JavaScript實(shí)現(xiàn)簡單購物小表格
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡單購物小表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
JSCode all of Brower 全局屏蔽網(wǎng)頁右鍵功能 具體實(shí)現(xiàn)
JSCode all of Brower 全局屏蔽網(wǎng)頁右鍵功能 具體實(shí)現(xiàn),需要的朋友可以參考一下2013-06-06
JavaScript轉(zhuǎn)換農(nóng)歷類實(shí)現(xiàn)及調(diào)用方法
農(nóng)歷是日常生活中不可或缺的一部分,它與人類的生活息息相關(guān),從某種程度上說,它一直伴隨著我們,今天的任務(wù)是JavaScript轉(zhuǎn)換農(nóng)歷類的實(shí)現(xiàn),感興趣的你可以千萬不要錯(cuò)過,希望本文對你有所幫助2013-01-01
JavaScript實(shí)現(xiàn)小程序圖片裁剪功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)小程序圖片裁剪功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
10個(gè)經(jīng)典的網(wǎng)頁鼠標(biāo)特效代碼
小編為廣大讀者們整理了10個(gè)經(jīng)典的網(wǎng)頁鼠標(biāo)特效代碼,并對代碼進(jìn)行了編譯和解釋,需要的朋友收藏下吧。2018-01-01
深入淺析JavaScript中prototype和proto的關(guān)系
prototype,每一個(gè)函數(shù)對象都有一個(gè)顯示的prototype屬性,而proto每個(gè)對象都有一個(gè)名為_proto_內(nèi)部隱藏屬性。本文給大家介紹JavaScript中prototype和proto的關(guān)系,需要的朋友參考下2015-11-11

