最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS數(shù)據(jù)類型判斷的9種方式總結(jié)

 更新時(shí)間:2022年12月29日 10:11:40   作者:昆吾kw  
談到JS的類型判斷大家應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于JS數(shù)據(jù)類型判斷的9種方式,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

JS 的數(shù)據(jù)類型檢測是一道經(jīng)典的八股文面試題。相信大家都能條件反射的回答出 4 種方法:typeof、constructor、instanceof 和 Object.prototype.toString,并且對它們各自的優(yōu)缺點(diǎn)也是張口就來。

本文對這些方法做了簡單歸納,同時(shí)又補(bǔ)充了其他 5 種和數(shù)據(jù)類型檢測有關(guān)的方法,供諸君食用。

typeof:檢測基礎(chǔ)數(shù)據(jù)類型和函數(shù)很好用

typeof 應(yīng)該是我學(xué)習(xí)到的第一個(gè) JS 的方法,也是使用頻率最高的一個(gè)用來檢測數(shù)據(jù)類型的方法。

它能準(zhǔn)確判斷出的數(shù)據(jù)類型有:Number,String,Boolean,Undefined,Symbol,BigInt,F(xiàn)unction。

它的缺點(diǎn)就是不能準(zhǔn)確判斷 null 的類型,而是返回 “object”。對于數(shù)組,日期,普通對象等數(shù)據(jù),統(tǒng)一返回 “object”。

所以在判斷基本數(shù)據(jù)類型(除了 null)和函數(shù)類型時(shí),都會(huì)使用它。

constructor:返回實(shí)例對象的構(gòu)造函數(shù)

學(xué)習(xí) JS 到面向?qū)ο蟮碾A段時(shí),會(huì)學(xué)到 JS 的原型鏈和原型對象,會(huì)學(xué)到通過 new 一個(gè)構(gòu)造函數(shù),來創(chuàng)建實(shí)例對象。

構(gòu)造函數(shù)的原型對象上會(huì)有一個(gè) constructor 屬性,指向了構(gòu)造函數(shù)自身,所以實(shí)例對象通過原型鏈訪問 constructor 屬性,就能找到自己的構(gòu)造函數(shù),也就是自己的類型了。

它的本意是用來標(biāo)識(shí)自己的構(gòu)造函數(shù),卻臨時(shí)拉來當(dāng)壯丁,用來判斷數(shù)據(jù)類型,當(dāng)然也存在一定的風(fēng)險(xiǎn):

  • null,undefined 沒有構(gòu)造函數(shù),自然也就訪問不到該屬性,因此不能使用此屬性來判斷
  • constructor 可以被改寫,所以不一定準(zhǔn)確

來看幾個(gè)例子:

console.log((1).constructor === Number) // true
?
console.log([1, 2, 3].constructor === Array) // true
?
console.log(undefined.constructor === Array) // 報(bào)錯(cuò)

在平時(shí)寫代碼時(shí),基本上不會(huì)用它來做數(shù)據(jù)類型的檢測。

instanceof:沿著原型鏈去找

它和 constructor 一樣,也是臨時(shí)拉來當(dāng)壯丁。它的作用是檢測實(shí)例對象是不是屬于某個(gè)構(gòu)造函數(shù),可以用來做數(shù)據(jù)類型的檢測。

術(shù)業(yè)有專攻,所以它也有缺點(diǎn):

  • 不能檢測基本數(shù)據(jù)類型
  • 原型鏈可能被修改,導(dǎo)致檢測結(jié)果不準(zhǔn)確
  • 只要能在原型鏈上找到構(gòu)造函數(shù),就返回 true,所以類型可能不準(zhǔn)確

來看幾個(gè)例子:

console.log(1 instanceof Number) // false
?
console.log([] instanceof Array) // true
?
console.log([] instanceof Object) // true

實(shí)際中 instanceof 也很少用。

Object.prototype.toString:是個(gè)大拿

看名字它是用來將一個(gè)值轉(zhuǎn)為字符串的,但其實(shí)并不是,它是一個(gè)專門檢測數(shù)據(jù)類型的方法。

它返回的值是一個(gè)形如 [object Object] 的字符串,比如:

console.log(toString.call('123'))        // [object String]
console.log(toString.call(null))         // [object Null]
console.log(toString.call(true))         // [object Boolean]
console.log(toString.call({}))           // [object Object]
console.log(toString.call([]))           // [object Array]
console.log(toString.call(function(){})) // [object Function]
console.log(toString.call(new Map))      // [object Map]
console.log(toString.call(new WeakSet))  // [object WeakSet]

通常會(huì)編寫一個(gè)函數(shù),對返回的字符串從第8位做一個(gè)截取,截取到倒數(shù)第一位,再去做類型比較。

Symbol.toStringTag:自定義類型

上面的 Object.prototype.toString 方法,之所以對不同的數(shù)據(jù)類型,返回不同的標(biāo)識(shí)字符串,就是因?yàn)?Symbol.toStringTag

Symbol.toStringTag 是一個(gè)內(nèi)置符號(hào)屬性,它的值是一個(gè)字符串,用于表示一個(gè)對象的默認(rèn)描述,也就是調(diào)用 Object.prototype.toString 會(huì)返回的內(nèi)容,比如:

let obj = {}
obj[Symbol.toStringTag] = 'ABC'
console.log(Object.prototype.toString.call(obj)) // [object ABC]

對于自定義對象,調(diào)用上面的方法,都只會(huì)返回 [object Object]。此時(shí)就可以使用 Symbol.toStringTag 來指定一個(gè)確定的類型了,比如:

class Person{
    get[Symbol.toStringTag](){
        return 'Person'
    }
}
let person = new Person()
?
console.log(Object.prototype.toString.call(person)) // [object Person]

Object.prototype.isPrototypeOf:和 instanceof 類似

isPrototypeOf 和 instanceof 類似,都是基于原型鏈和原型對象去做判斷的。它用來檢查一個(gè)對象是否存在于另一個(gè)對象的原型鏈上。

function Person() {
    
}
?
let person = new Person()
?
console.log(Person.prototype.isPrototypeOf(person))

Array.isArray:專業(yè)檢測數(shù)組三十年

起初以為它是 ES6 提供的新方法,后來得知其實(shí)屬于 ES 5.1 規(guī)范。

看名字就知道,它是專門用于檢測數(shù)組類型的,該方法的命名真實(shí)言簡意賅。

Array.isArray([]) // true

Number.isNaN

這個(gè)方法就是真的屬于 ES6 標(biāo)準(zhǔn)了。

我們知道,JS 中有一個(gè)特殊的“數(shù)字” NaN,表示 not a number,不是一個(gè)數(shù)字,但它卻歸屬于數(shù)字類型:

console.log(typeof NaN) // 'number'

NaN 用于表示不是一個(gè)數(shù)字,它不等于任何值,包括它本身。在 ES6 之前,windows 對象提供了一個(gè)全局方法 isNaN,用于判斷一個(gè)數(shù)字是不是 NaN:

isNaN(10) // false
isNaN('abc') // true
isNaN(NaN) // true

可以發(fā)現(xiàn),isNaN 對于字符串的檢測結(jié)果也是 NaN。但這其實(shí)并不嚴(yán)謹(jǐn),它對要判斷的數(shù)據(jù)做了一個(gè)隱式類型轉(zhuǎn)換,先轉(zhuǎn)為數(shù)字再進(jìn)行判斷。而NaN 的檢測應(yīng)該僅限于數(shù)字類型,所以 ES6 提供了 Number.isNaN 方法:

Number.isNaN(NaN) // true
Number.isNaN('123') // false

它能判斷一個(gè)值是否嚴(yán)格等于NaN。

等比較:與固定值進(jìn)行比較

直接通過與一個(gè)特定的值進(jìn)行比較,從而判斷數(shù)據(jù)的類型,比如:

let value = null
console.log(value === null) // true
?
// 同時(shí)判斷一個(gè)值是 undefined 或者 null
let value
console.log(value == null) // true

總結(jié)

本文整理了 JS 中常用的判斷數(shù)據(jù)類型的方法,其中 typeof 和 Object.prototype.toString 使用場景是最多的,對一些特殊的數(shù)據(jù)類型,比如 null,NaN,自定義類型,可以選擇其他的方式去進(jìn)行判斷,做到靈活運(yùn)用。

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

相關(guān)文章

  • 淺談javascript的閉包

    淺談javascript的閉包

    本文介紹了javascript閉包的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • uni-app小程序沉浸式導(dǎo)航實(shí)現(xiàn)的全過程

    uni-app小程序沉浸式導(dǎo)航實(shí)現(xiàn)的全過程

    在跨端項(xiàng)目開發(fā)中,uniapp是個(gè)不錯(cuò)的框架,下面這篇文章主要給大家介紹了關(guān)于uni-app小程序沉浸式導(dǎo)航實(shí)現(xiàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-10-10
  • ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法

    ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法

    這篇文章主要介紹了ES6中Proxy與Reflect實(shí)現(xiàn)重載(overload)的方法,分析了重載的原理及使用Proxy和Reflect來實(shí)現(xiàn)重載的操作步驟與相關(guān)技巧,需要的朋友可以參考下
    2017-03-03
  • JS加載解析Markdown文檔過程詳解

    JS加載解析Markdown文檔過程詳解

    這篇文章主要介紹了JS加載解析Markdown文檔過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • setInterval和setTimeout停止的方法

    setInterval和setTimeout停止的方法

    要想知道它們是怎么停止的,首先我們要了解它們的運(yùn)行機(jī)制和原理,下面是具體的介紹。
    2011-01-01
  • JavaScript中的ajax功能的概念和示例詳解

    JavaScript中的ajax功能的概念和示例詳解

    AJAX即“Asynchronous Javascript And XML”(異步JavaScript和XML)。這篇文章主要給大家介紹了JavaScript中的ajax功能的概念和示例詳解,感興趣的朋友一起看看吧
    2016-10-10
  • JavaScript 使用技巧精萃(.net html

    JavaScript 使用技巧精萃(.net html

    下面是一些編程語言中,經(jīng)常需要用到j(luò)s驗(yàn)證的一些代碼加入方法大家可以參考下。
    2009-04-04
  • 基于input框覆蓋掉數(shù)字英文的實(shí)例講解

    基于input框覆蓋掉數(shù)字英文的實(shí)例講解

    下面小編就為大家?guī)硪黄趇nput框覆蓋掉數(shù)字英文的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 網(wǎng)頁整體變灰白色(兼容各瀏覽器)實(shí)例

    網(wǎng)頁整體變灰白色(兼容各瀏覽器)實(shí)例

    網(wǎng)頁整體變灰白色(兼容各瀏覽器)實(shí)例,需要的朋友可以參考一下
    2013-04-04
  • ES6的循環(huán)與可迭代對象示例詳解

    ES6的循環(huán)與可迭代對象示例詳解

    這篇文章主要給大家介紹了關(guān)于ES6的循環(huán)與可迭代對象的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

峨山| 岳普湖县| 乌拉特前旗| 崇阳县| 哈尔滨市| 辽阳市| 朝阳县| 定结县| 久治县| 墨脱县| 仙居县| 普兰店市| 治多县| 乌苏市| 右玉县| 彩票| 西乌珠穆沁旗| 兴山县| 察雅县| 池州市| 关岭| 黄浦区| 镇巴县| 泸州市| 井研县| 辉南县| 清远市| 安多县| 连山| 平谷区| 鄢陵县| 牙克石市| 罗甸县| 鱼台县| 江源县| 浠水县| 长宁县| 双柏县| 永德县| 剑河县| 行唐县|