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

詳解JavaScript如何準(zhǔn)確獲取任意變量的數(shù)據(jù)類型

 更新時(shí)間:2022年06月27日 09:20:29   作者:諸葛小愚  
js是弱類型語(yǔ)言,或者說(shuō)是動(dòng)態(tài)語(yǔ)言,在定義變量時(shí)我們可以不提前聲明變量的類型,也可以在變量聲明后賦予不同類型的值。所以本文為大家詳解一下JavaScript如何準(zhǔn)確獲取任意變量的數(shù)據(jù)類型,需要的可以參考一下

js是弱類型語(yǔ)言,或者說(shuō)是動(dòng)態(tài)語(yǔ)言,在定義變量時(shí)我們可以不提前聲明變量的類型,也可以在變量聲明后賦予不同類型的值。變量的類型會(huì)在程序運(yùn)行的過(guò)程中被確定。對(duì)于開發(fā)者來(lái)說(shuō),雖然可以不用頻繁的定義不同的數(shù)據(jù)類型,但是如果是比較復(fù)雜的項(xiàng)目,或者接手他人的項(xiàng)目,發(fā)現(xiàn)一個(gè)變量到處被使用并且賦予不同類型的值,也許頭都大了。變量類型的不確定還可能出現(xiàn)運(yùn)行時(shí)報(bào)錯(cuò):xxx is not a function,根本原因就是不同的數(shù)據(jù)類型所具有的方法是不一樣的,也許有的大家都有,因此不報(bào)錯(cuò);但是如果是特有的,或者有差異的,不判斷變量的類型就直接調(diào)用,就有可能出現(xiàn)生產(chǎn)bug。那么應(yīng)該如何才能獲取準(zhǔn)確的變量類型呢?

判斷類型常用的方法

typeof

js內(nèi)置的一個(gè)運(yùn)算符,返回一個(gè)字符串,表示操作數(shù)的類型。可用于number、string、boolean等值類型,function函數(shù),object等引用類型,如果是判斷對(duì)象類型,則只能得到object,無(wú)法得到具體的值。

console.log(typeof ''); // string
console.log(typeof (() => {})); // function
console.log(typeof Symbol()); // symbol
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object

我們可以看到,數(shù)組、對(duì)象通過(guò)typeof都是返回了object,無(wú)法細(xì)分;其中值得注意的是typeof null結(jié)果也是object。這是因?yàn)樵趈s的最初實(shí)現(xiàn)中,js中的值是由一個(gè)表示類型的標(biāo)簽以及實(shí)際數(shù)據(jù)值組合表示的。對(duì)象類型的標(biāo)簽是0,我們都知道null表示空,在大多數(shù)平臺(tái)下其值為0x00,因此對(duì)象和null的類型標(biāo)簽是一樣的。類型標(biāo)簽一樣,但是null卻沒(méi)有正常對(duì)象的屬性以及方法。

instanceof

instanceof也是js內(nèi)置的一個(gè)運(yùn)算符,用于判斷兩個(gè)參數(shù)之間是否存在聯(lián)系,實(shí)現(xiàn)原理是檢測(cè)構(gòu)造函數(shù)的prototype屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。如果是,則返回true;否則,返回false。

console.log({} instanceof Array); // false
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log([] instanceof Object); // true

instanceof是判斷兩個(gè)參數(shù),并不會(huì)直接獲取變量的類型,可以通過(guò)枚舉的方式簡(jiǎn)介獲取。

toString

每一個(gè)對(duì)象都有一個(gè)toString()方法,因?yàn)槊總€(gè)對(duì)象都會(huì)繼承自Object。可能在大多數(shù)人的印象中,toString()只是用來(lái)返回一個(gè)字符串,并沒(méi)有什么特別的地方,那是因?yàn)槟憧吹降?code>toString()基本上都是被重寫后的,原始的toString()是可以用來(lái)獲取對(duì)象的類型的。

舉個(gè)例子:

const o = new Object();
o.toString(); // [object Object]
const arr = [1,2,3]; // 數(shù)組也會(huì)繼承自O(shè)bject
arr.toString(); // '1,2,3',因?yàn)閿?shù)組重寫了toString

每個(gè)對(duì)象都能通過(guò)Object.prototype.toString.call(thisArg)或者Object.prototype.toString.apply(thisArg)來(lái)獲取其類型:

console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call(undefined)); // [object Undefined]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call({})); // [object Object]
console.log(Object.prototype.toString.call(() => {})); // [object Function]

每次都調(diào)用js內(nèi)置的API還是有點(diǎn)麻煩,所以我們還是封裝一個(gè)函數(shù)getType

封裝一個(gè)獲取類型的函數(shù)

typeof + instanceof(不推薦)

之前我們也提到了typeof可以獲取部分?jǐn)?shù)據(jù)類型,instanceof可以用枚舉來(lái)表示剩下的類型,那么這兩者結(jié)合是不是就可以實(shí)現(xiàn)getType了呢?

function getType(obj) {
    if (typeof obj === 'object') {
        if (obj instanceof Array) return 'array';
        if (obj instanceof Map) return 'map';
        if (obj instanceof Set) return 'set';
        if (obj instanceof RegExp) return 'regexp';
        // 盡可能枚舉類型,最后兜底返回object
        return 'object'
    }
    return (typeof obj);
}
console.log(getType(null)); // object
console.log(getType(undefined)); // undefined
console.log(getType('')); // string
console.log(getType([])); // array
console.log(getType(/a/)); // regexp
console.log(getType(new WeakMap())); // object
console.log(getType(new WeakSet())); // object

使用此方式雖然可以實(shí)現(xiàn)getType,但是存在弊端;

  • 由于是枚舉,導(dǎo)致代碼長(zhǎng)度可能會(huì)很長(zhǎng)
  • 枚舉的數(shù)據(jù)類型可能有限,未能覆蓋常用數(shù)據(jù)類型
  • 如果要新增類型,則需要修改代碼

toString

關(guān)于toString()的用法剛剛已經(jīng)說(shuō)了,我們以此來(lái)實(shí)現(xiàn)一個(gè)getType

function getType(obj) {
    const originType = Object.prototype.toString.call(obj); // 獲取類型。返回格式為[object type],需要提取出type的值
    const firstSpaceIndex = originType.indexOf(' '); // 找到第一個(gè)空格所在下標(biāo)
    const type = originType.slice(firstSpaceIndex + 1, -1); // 跳過(guò)空格,截取到倒數(shù)第一個(gè)字符(不含最后一個(gè))
    return type.toLowerCase(); // 轉(zhuǎn)換為小寫
}
console.log(getType(null)); // null
console.log(getType(undefined)); // undefined
console.log(getType('')); // string
console.log(getType([])); // array
console.log(getType(/a/)); // regexp
console.log(getType(new WeakMap())); // weakmap
console.log(getType(new WeakSet())); // weakset

實(shí)現(xiàn)getType我們也可以借助于操作數(shù)組的方式:

function getType(obj) {
    const originType = Object.prototype.toString.call(obj); // 獲取類型。返回格式為[object type],需要提取出type的值
    const tmpType = originType.split(' ')[1]; // 根據(jù)空格分割,并取第二個(gè)
    const type = tmpType.slice(0, -1); // 從0截取到倒數(shù)第一個(gè)字符(不含最后一個(gè))
    return type.toLowerCase(); // 轉(zhuǎn)換為小寫
}
console.log(getType(null)); // null
console.log(getType(undefined)); // undefined
console.log(getType('')); // string
console.log(getType([])); // array
console.log(getType(/a/)); // regexp
console.log(getType(new WeakMap())); // weakmap
console.log(getType(new WeakSet())); // weakset

兩者實(shí)現(xiàn)結(jié)果是一致的,基本上實(shí)現(xiàn)了我們的既定目標(biāo),而且可以獲取到所有的數(shù)據(jù)類型。不同的是,操作數(shù)組比直接操作字符串更消耗性能。

總結(jié)

實(shí)現(xiàn)一個(gè)獲取變量類型的方法,其實(shí)并不復(fù)雜,簡(jiǎn)單來(lái)說(shuō)就是使用了內(nèi)置的API:Object.prototype.toString()。有時(shí)候,往往就是因?yàn)檫^(guò)于簡(jiǎn)單而被我們忽略,其實(shí)越是簡(jiǎn)單的方式,才是越有效的。

以上就是詳解JavaScript如何準(zhǔn)確獲取任意變量的數(shù)據(jù)類型的詳細(xì)內(nèi)容,更多關(guān)于JavaScript獲取變量數(shù)據(jù)類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js中判斷用戶輸入的值是否為空的簡(jiǎn)單實(shí)例

    js中判斷用戶輸入的值是否為空的簡(jiǎn)單實(shí)例

    本篇文章主要是對(duì)js中判斷用戶輸入的值是否為空的簡(jiǎn)單實(shí)例進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • 使用webpack處理stylus文件的配置方法

    使用webpack處理stylus文件的配置方法

    這篇文章主要介紹了使用webpack處理stylus文件的配置方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-03-03
  • javascript 日期時(shí)間 轉(zhuǎn)換的方法

    javascript 日期時(shí)間 轉(zhuǎn)換的方法

    javascript 日期時(shí)間 轉(zhuǎn)換的方法,需要的朋友可以參考一下
    2013-02-02
  • Bootstrap面板學(xué)習(xí)使用

    Bootstrap面板學(xué)習(xí)使用

    這篇文章主要為大家詳細(xì)介紹了Bootstrap面板的學(xué)習(xí)使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享

    JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享,包括對(duì)播放完歌單之后沒(méi)有將要播放的歌曲的提示功能,需要的朋友可以參考下
    2016-03-03
  • react腳手架配置路徑別名的方法

    react腳手架配置路徑別名的方法

    本文主要介紹了react腳手架配置路徑別名的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 微信小程序tabBar用法實(shí)例詳解

    微信小程序tabBar用法實(shí)例詳解

    這篇文章主要介紹了微信小程序tabBar用法,結(jié)合實(shí)例形式詳細(xì)分析了微信小程序中tabBar的功能、配置項(xiàng)使用方法與操作注意事項(xiàng),并附帶完整demo源碼供讀者下載參考,需要的朋友可以參考下
    2017-12-12
  • 如何在TypeScript中正確的遍歷一個(gè)對(duì)象

    如何在TypeScript中正確的遍歷一個(gè)對(duì)象

    在TypeScript里面,也會(huì)遇到需要遍歷對(duì)象的時(shí)候,下面這篇文章主要給大家介紹了關(guān)于如何在TypeScript中正確的遍歷一個(gè)對(duì)象的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • 使用Three.js?實(shí)現(xiàn)虎年春節(jié)3D創(chuàng)意頁(yè)面

    使用Three.js?實(shí)現(xiàn)虎年春節(jié)3D創(chuàng)意頁(yè)面

    虎年春節(jié)將至,本文使用?React?+?Three.js技術(shù)棧,實(shí)現(xiàn)趣味?3D創(chuàng)意頁(yè)面,主要包括:ShadowMaterial、?MeshPhongMaterial等基本材質(zhì)的使用、使用?LoadingManager展示模型加載進(jìn)度、OrbitControls`的緩動(dòng)動(dòng)畫、TWEEN簡(jiǎn)單補(bǔ)間動(dòng)畫效果等,感興趣的朋友一起看看吧
    2022-01-01
  • JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能

    JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器小功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10

最新評(píng)論

郁南县| 朝阳县| 永安市| 同德县| 牟定县| 喜德县| 光泽县| 铁力市| 宣汉县| 满洲里市| 大宁县| 会东县| 甘南县| 海原县| 兖州市| 云林县| 盐城市| 惠来县| 镇坪县| 淮安市| 海口市| 喀什市| 农安县| 安顺市| 绥棱县| 德州市| 东方市| 德阳市| 察隅县| 西吉县| 富蕴县| 南和县| 宁夏| 浦东新区| 东台市| 海宁市| 牙克石市| 锡林浩特市| 苗栗市| 彰化市| 芦山县|