亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS中數(shù)據(jù)類型的正確判斷方法實(shí)例

 更新時(shí)間:2021年08月26日 14:24:46   作者:so丶簡(jiǎn)單  
怎么去判斷一個(gè)數(shù)據(jù)屬于哪個(gè)數(shù)據(jù)類型,這個(gè)是很常見(jiàn)的操作,我們一般都會(huì)想到typeof和instanceof這兩個(gè)常見(jiàn)的方法,但有時(shí)候這兩種方法并不能滿足我們的需求,下面這篇文章主要給大家介紹了關(guān)于JS中數(shù)據(jù)類型的正確判斷方法,需要的朋友可以參考下

前言

Javascript是一門動(dòng)態(tài)類型的語(yǔ)言,一個(gè)變量從聲明到最后使用,可能經(jīng)過(guò)了很多個(gè)函數(shù),而數(shù)據(jù)類型也會(huì)發(fā)生改變,那么,對(duì)一個(gè)變量的數(shù)據(jù)類型判斷就顯得尤為重要。

typeof是否能正確判斷類型?

typeof 是一個(gè)操作符,其右側(cè)跟一個(gè)一元表達(dá)式,并返回這個(gè)表達(dá)式的數(shù)據(jù)類型。返回的結(jié)果用該類型的字符串(全小寫字母)形式表示,包括以下 7 種:number、boolean、symbol、string、object、undefined、function 等。

由于由于歷史原因,在判斷原始類型時(shí),typeof null會(huì)等于object。而且對(duì)于對(duì)象(Object)、數(shù)組(Array)來(lái)說(shuō),都會(huì)轉(zhuǎn)換成object。例子如下:

    typeof 1 // 'number'
    typeof "1" // 'string'
    typeof null // 'object'
    typeof undefined // 'undefined'
    
    typeof [] // 'object'
    typeof {} // 'object'
    typeof function() {} // 'function'

所以我們可以發(fā)現(xiàn),typeof可以判斷基本數(shù)據(jù)類型,但是難以判斷除了函數(shù)以外的復(fù)雜數(shù)據(jù)類型。于是我們可以使用第二種方法,通常用來(lái)判斷復(fù)雜數(shù)據(jù)類型,也可以用來(lái)判斷基本數(shù)據(jù)類型。

對(duì)于返回值為object,有三種情況:

  • 值為null
  • 值為object
  • 值為array

對(duì)于null,我們可以直接用===來(lái)進(jìn)行判斷,那么數(shù)組和對(duì)象呢?不急,我們接著說(shuō)。

instanceof是否能正確判斷類型?

instanceof 是用來(lái)判斷 A 是否為 B 的實(shí)例,表達(dá)式為:A instanceof B,如果 A 是 B 的實(shí)例,則返回 true,否則返回 false。

instanceof是通過(guò)原型鏈來(lái)判斷的,但是對(duì)于對(duì)象來(lái)說(shuō),Array也會(huì)被轉(zhuǎn)換成Object,而且也不能區(qū)分基本類型string和boolean??梢宰筮叿拍阋袛嗟膬?nèi)容,右邊放類型來(lái)進(jìn)行JS類型判斷,只能用來(lái)判斷復(fù)雜數(shù)據(jù)類型,因?yàn)閕nstanceof 是用于檢測(cè)構(gòu)造函數(shù)(右邊)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象(左邊)的原型鏈上。例如:

    function Func() {}
    const func = new Func()
    console.log(func instanceof Func) // true
    
    const obj = {}
    const arr = []
    obj instanceof Object // true
    arr instanceof Object // true
    arr instanceof Array // true
    
    const str = "abc"
    const str2 = new String("abc")
    str instanceof String // false
    str2 instanceof String // true

單獨(dú)使用instanceof好像也是不行的,但是我們對(duì)于typeof已經(jīng)得出結(jié)論,不能區(qū)分?jǐn)?shù)組和對(duì)象,那么,我們結(jié)合下instanceof,來(lái)寫一個(gè)完整的判斷邏輯

    function myTypeof(data) {
        const type = typeof data
        if (data === null) {
            return 'null'
        }
        if (type !== 'object') {
            return type
        }
        if (data instanceof Array) {
            return 'array'
        }
        return 'object'
    }

Object.prototype.toString.call()

上面我們通過(guò)typeof和instanceof實(shí)現(xiàn)了一版類型判斷,那么是否有其他渠道,使我們的代碼更加簡(jiǎn)潔嗎?答案就是使用Object.prototype.toString.call()。

每個(gè)對(duì)象都有一個(gè)toString()方法,當(dāng)要將對(duì)象表示為文本值或以預(yù)期字符串的方式引用對(duì)象時(shí),會(huì)自動(dòng)調(diào)用該方法。默認(rèn)情況下,從Object派生的每個(gè)對(duì)象都會(huì)繼承toString()方法。如果此方法未在自定義對(duì)象中被覆蓋,則toString()返回

    Object.prototype.toString.call(new Date()) // [object Date]
    Object.prototype.toString.call("1") // [object String]
    Object.prototype.toString.call(1) // [object Numer]
    Object.prototype.toString.call(undefined) // [object Undefined]
    Object.prototype.toString.call(null) // [object Null]

所以綜合上述知識(shí)點(diǎn),我們可以封裝出以下通用類型判斷方法:

    function myTypeof(data) {
        var toString = Object.prototype.toString;
        var dataType = data instanceof Element ? "element" : toString.call(data).replace(/\[object\s(.+)\]/, "$1").toLowerCase()
        return dataType
    };

    myTypeof("a") // string
    myTypeof(1) // number
    myTypeof(window) // window
    myTypeof(document.querySelector("h1")) // element

constructor

constructor 判斷方法跟instanceof相似,但是constructor檢測(cè)Object與instanceof不一樣,constructor還可以處理基本數(shù)據(jù)類型的檢測(cè),不僅僅是對(duì)象類型。

注意:

1.null和undefined沒(méi)有constructor;

2.判斷數(shù)字時(shí)使用(),比如  (123).constructor,如果寫成123.constructor會(huì)報(bào)錯(cuò)

3.constructor在類繼承時(shí)會(huì)出錯(cuò),因?yàn)镺bject被覆蓋掉了,檢測(cè)結(jié)果就不對(duì)了

    function A() {};
    function B() {};
    A.prototype = new B();
    console.log(A.constructor === B)  // false

    var C = new A();
    console.log(C.constructor === B)  // true
    console.log(C.constructor === A)  // false 

    C.constructor = A;
    console.log(C.constructor === A);  // true
    console.log(C.constructor === B);  // false

Array.isArray()

Array.isArray() 用于確定傳遞的值是否是一個(gè) Array。如果對(duì)象是 Array ,則返回true,否則為false。

    Array.isArray([1, 2, 3]); // true
    Array.isArray({foo: 123}); // false
    Array.isArray("foobar"); // false
    Array.isArray(undefined); // false

正則判斷

我們可以把對(duì)象和數(shù)組轉(zhuǎn)成一個(gè)字符串,這樣就可以做格式判斷,從而得到最終的類型。

    function myTypeof(data) {
        const str = JSON.stringify(data)
        if (/^{.*}$/.test(data)) {
            return 'object'
        }
        if (/^\[.*\]$/.test(data)) {
            return 'array'
        }
    }

總結(jié)

到此這篇關(guān)于JS中數(shù)據(jù)類型的正確判斷方法的文章就介紹到這了,更多相關(guān)JS數(shù)據(jù)類型判斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

到此這篇關(guān)于JS中數(shù)據(jù)類型的正確判斷方法的文章就介紹到這了,更多相關(guān)JS數(shù)據(jù)類型判斷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript中的nextSibling使用陷(da)阱(keng)

    javascript中的nextSibling使用陷(da)阱(keng)

    關(guān)于HTML/XML節(jié)點(diǎn)的問(wèn)題,在IE中nextSibling不會(huì)返回文本節(jié)點(diǎn),而chrome或者firefox等會(huì)返回文本節(jié)點(diǎn)
    2014-05-05
  • js文字橫向滾動(dòng)特效

    js文字橫向滾動(dòng)特效

    這篇文章主要介紹了js文字橫向滾動(dòng)特效,實(shí)現(xiàn)過(guò)程很簡(jiǎn)單,文字在某塊區(qū)域內(nèi)橫向無(wú)間隙滾動(dòng),感興趣的小伙伴們可以參考一下
    2015-11-11
  • JavaScript之排序函數(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    JavaScript之排序函數(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    排序也是在程序中經(jīng)常用到的算法。這篇文章主要介紹了JavaScript之排序函數(shù),有興趣的可以了解一下
    2017-06-06
  • Bootstrap創(chuàng)建可折疊的組件

    Bootstrap創(chuàng)建可折疊的組件

    這篇文章主要為大家詳細(xì)介紹了Bootstrap創(chuàng)建可折疊組件的對(duì)應(yīng)方法,以實(shí)例為大家分享了Bootstrap折疊組件,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 萬(wàn)物皆可柯里化的Ramda.js及傳參詳解

    萬(wàn)物皆可柯里化的Ramda.js及傳參詳解

    這篇文章主要為大家介紹了萬(wàn)物皆可柯里化的Ramda.js詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • JS實(shí)現(xiàn)發(fā)送短信驗(yàn)證后按鈕倒計(jì)時(shí)功能(防止刷新倒計(jì)時(shí)失效)

    JS實(shí)現(xiàn)發(fā)送短信驗(yàn)證后按鈕倒計(jì)時(shí)功能(防止刷新倒計(jì)時(shí)失效)

    這篇文章主要介紹了JS實(shí)現(xiàn)發(fā)送短信驗(yàn)證后按鈕倒計(jì)時(shí)功能防止刷新倒計(jì)時(shí)失效問(wèn)題,在項(xiàng)目開(kāi)發(fā)中經(jīng)常會(huì)用到此功能,下面小編通過(guò)本文給大家分享JS實(shí)現(xiàn)發(fā)送短信驗(yàn)證后按鈕倒計(jì)時(shí)功能(防止刷新倒計(jì)時(shí)失效),需要的朋友參考下吧
    2017-07-07
  • js查找節(jié)點(diǎn)的方法小結(jié)

    js查找節(jié)點(diǎn)的方法小結(jié)

    這篇文章主要介紹了js查找節(jié)點(diǎn)的方法,實(shí)例總結(jié)了查找節(jié)點(diǎn)常用的三種方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 微信小程序?qū)崿F(xiàn)底部彈出模態(tài)框

    微信小程序?qū)崿F(xiàn)底部彈出模態(tài)框

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)底部彈出模態(tài)框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • png在IE6 下無(wú)法透明的解決方法匯總

    png在IE6 下無(wú)法透明的解決方法匯總

    解決PNG圖片在IE6下的透明這類問(wèn)題谷歌上很多解決方案,屬于非常常見(jiàn)的問(wèn)題,以前我做的時(shí)候,這類透明我都是用gif,而直接避開(kāi)png,所以到現(xiàn)在我并沒(méi)有去了解過(guò)這個(gè)問(wèn)題。今天就把這個(gè)問(wèn)題整理下,解決方案匯總給大家。
    2015-05-05
  • JSON字符串和JSON對(duì)象相互轉(zhuǎn)化實(shí)例詳解

    JSON字符串和JSON對(duì)象相互轉(zhuǎn)化實(shí)例詳解

    這篇文章主要介紹了JSON字符串和JSON對(duì)象相互轉(zhuǎn)化方法,結(jié)合實(shí)例形式詳細(xì)分析了json對(duì)象與字符串的功能、使用、轉(zhuǎn)換方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-01-01

最新評(píng)論