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

JavaScript中判斷數(shù)據(jù)類型的實(shí)用方法總結(jié)

 更新時(shí)間:2025年01月03日 15:48:02   作者:鐵錘妹妹i  
最近項(xiàng)目中有不少地方需要判斷數(shù)據(jù)類型,但是判斷數(shù)據(jù)類型也有好幾種方法,并且每種方法判斷的數(shù)據(jù)類型也有局限性,所以本文就來為大家總結(jié)一下js中判斷數(shù)據(jù)類型的幾種實(shí)用方法吧

前言

最近項(xiàng)目中有不少地方需要判斷數(shù)據(jù)類型,但是判斷數(shù)據(jù)類型也有好幾種方法,并且每種方法判斷的數(shù)據(jù)類型也有局限性,所以想總結(jié)一下,方便以后查閱。

分別是 typeof ,instanceof,Object.prototype.toString.call()

1. typeof

  • typeof 它返回值是一個(gè)字符串,該字符串說明運(yùn)算數(shù)的類型。返回結(jié)果只有以下幾種:number,string,boolean,undfined,object,function
  • typeof 是用于判斷基本數(shù)據(jù)類型的,除了 null 都可以調(diào)用 typeof 顯示正確的類型。
  • 但對(duì)于引用數(shù)據(jù)類型,除了函數(shù)之外,都會(huì)顯示object,函數(shù)顯示 function;
  • 需要注意的是,typeof null ,結(jié)果是“object”。 這是個(gè)歷史設(shè)計(jì)缺陷。
  • 可以使用typeof判斷變量是否存在(比如 if(typeof a!="undfined"){ xxx }),而不要去使用if(a),因?yàn)閍不存在(未聲明)會(huì)報(bào)錯(cuò)。

1. 對(duì)于數(shù)字類型的操作數(shù)而言, typeof 返回的值是 number。比如:typeof(1),返回的值就是number。

2. 對(duì)于字符串類型, typeof 返回的值是 string。比如:typeof("123"),返回的值是string。

3. 對(duì)于布爾類型, typeof 返回的值是 boolean 。比如:typeof(true),返回的值是boolean。

4. 對(duì)于對(duì)象、數(shù)組、null 返回的值是 object 。比如:typeof(window),typeof(document),typeof(null)返回的值都是object。

5. 對(duì)于函數(shù)類型,返回的值是 function。比如:typeof(eval),typeof(Date)返回的值都是function。

6. 如果運(yùn)算數(shù)是沒有定義的(比如說不存在的變量、函數(shù)或者undefined),將返回undefined。 比如:typeof(sss)、typeof(undefined)都返回undefined。

下面 我們將用程序代碼驗(yàn)證一下:

console.log(typeof(1));  //number
console.log(typeof(NaN));  //number
console.log(typeof("123"));  //string
console.log(typeof("123" + 12));  //string
console.log(typeof("123" + Date));  //string
console.log(typeof(true));  //boolean
console.log(typeof(window));  //object
console.log(typeof(document));  //object
console.log(typeof(null));  //object
console.log(typeof([8]));  //object
console.log(typeof({a:1}));  //object
console.log(typeof(Date));  //function
console.log(typeof(sss));  //undefined
console.log(typeof(undefined));  //undefined

局限性: 由上面程序代碼可驗(yàn)證,很遺憾的一點(diǎn)是,typeof 在判斷一個(gè) object的數(shù)據(jù)的時(shí)候只能告訴我們這個(gè)數(shù)據(jù)是 object, 而不能細(xì)致的具體到是哪一種 object。所以要 想?yún)^(qū)分對(duì)象、數(shù)組、null,單純使用 typeof 是不行的

2. instanceof運(yùn)算符

instanceof 運(yùn)算符返回一個(gè)布爾值,表示 對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。 注意,instanceof運(yùn)算符最好用于對(duì)象引用類型,不適用原始類型的值。

基本用法:

// 判斷 p 是否為 Person 的實(shí)例
function Person(name) {
 this.name = name
}
const p = new Person('sunshine')
p instanceof Person // true

// 這里的 p 是 Person 函數(shù)構(gòu)造出來的,所以順著 p 的原型鏈可以找到 Object 的構(gòu)造函數(shù)
p.__proto__ === Person.prototype // true
p.__proto__.__proto__ === Object.prototype // true

缺點(diǎn):

對(duì)于基本類型的數(shù)據(jù),instanceof是不能直接判斷它的類型的,因?yàn)閷?shí)例是一個(gè)對(duì)象或函數(shù)創(chuàng)建的,是引用類型,所以需要通過基本類型對(duì)應(yīng)的 包裝對(duì)象 來判斷。所以對(duì)于 nullundefined 這兩個(gè)家伙就檢測不了了~

5 instanceof Number // false
new Number(5) instanceof Number  // true

因?yàn)樵玩溊^承的關(guān)系,instanceof 會(huì)把數(shù)組都識(shí)別為 Object 對(duì)象,所有引用類型的祖先都是 Object 對(duì)象

let arr = [1,2,3]
console.log(Object.prototype.toString.call(arr) === '[object Array]') // true
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true
let fn = function(){}
console.log(fn instanceof Object)  // true

另外,instanceof 也是能判斷基本數(shù)據(jù)類型的,比如下面這種方式,這個(gè)了解就行,真的要判斷基本數(shù)據(jù)類型還是用 typeof

class PrimitiveNumber {
  static [Symbol.hasInstance](x) {
    return typeof x === 'number'
  }
}
console.log(111 instanceof PrimitiveNumber) // true

如果你不知道Symbol,可以看看 MDN上關(guān)于hasInstance的解釋

其實(shí)就是自定義instanceof行為的一種方式,這里將原有的instanceof方法重定義,換成了typeof,因此能夠判斷基本數(shù)據(jù)類型。

特殊情況補(bǔ)充:

  • instanceof的原理是 檢查右邊構(gòu)造函數(shù)的prototype屬性,是否在左邊對(duì)象的原型鏈上;只要處于原型鏈中,判斷永遠(yuǎn)為true。
  • 有一種特殊情況,就是左邊對(duì)象的原型鏈上,只有null對(duì)象。這時(shí),instanceof判斷會(huì)失真;因?yàn)镺bject不在null原型鏈上
var obj = Object.create(null);
typeof obj // "object"
obj instanceof Object // false

上面代碼中,Object.create(null) 返回一個(gè)新對(duì)象obj,它的原型是null。右邊構(gòu)造函數(shù)的Object.prototype屬性,不在左邊的原型鏈上,因此instanceof就認(rèn)為obj不是Object的實(shí)例。這是唯一的instanceof運(yùn)算符判斷會(huì)失真的情況(一個(gè)對(duì)象的原型是null)。

下面介紹一種方法,對(duì)每一種數(shù)據(jù)類型都實(shí)用的。

3. Object.prototype.toString.call()

在判斷數(shù)據(jù)類型時(shí),我們稱 Object.prototype.toString 為 “萬能方法” “終極方法”,工作中也是比較常用而且準(zhǔn)確。 對(duì)于Object.prototype.toString() 方法,會(huì)返回一個(gè)形如 "[object XXX]" 的字符串

1) 判斷基本類型

Object.prototype.toString.call('stjd')
//"[object String]"
 
Object.prototype.toString.call(1)
//"[object Number]"
 
Object.prototype.toString.call(true)
//"[object Boolean]"

Object.prototype.toString.call(null)
//"[object Null]"

Object.prototype.toString.call(undefined)
//"[object Undefined]"

2) 判斷原生引用類型

a 函數(shù)類型

Object.prototype.toString.call(function(){})  //這個(gè)方法就建立在js任何類型皆可視為對(duì)象**
// "[object Function]"

b 日期類型

var date = new Date();
Object.prototype.toString.call(date);
//”[object Date]”

c 數(shù)組類型

Object.prototype.toString.call([2])
//"[object Array]"

d 對(duì)象類型

Object.prototype.toString.call({q:8})
//"[object Object]"

e 正則表達(dá)式

var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg); // "[object RegExp]"

f 自定義類型

function Person(name, age) {
    this.name = name;
    this.age = age;
}
var person = new Person("Rose", 18);
Object.prototype.toString.call(person); 
//”[object Object]”

顯然這種方法不能準(zhǔn)確判斷person是Person類的實(shí)例,而只能用instanceof 操作符來進(jìn)行判斷,如下所示:

console.log(person instanceof Person);//輸出結(jié)果為true

注意: Object.prototype.toString()本身是允許被修改的,而我們目前所討論的關(guān)于Object.prototype.toString()這個(gè)方法的應(yīng)用都是假設(shè)toString()方法未被修改為前提的。

因?yàn)閷?shí)例對(duì)象有可能會(huì)自定義toString()方法,會(huì)覆蓋Object.prototype.toString(), 所以在使用時(shí),最好加上call()。

有的時(shí)候我們也可以封裝判斷數(shù)據(jù)類型的方法。

// 判斷數(shù)據(jù)類型的函數(shù)
function getType(data) {
  return Object.prototype.toString.call(data).slice(8, -1);
}

// 使用
  if(this.getType(json) == 'Object'){
   console.log('Object類型')
  }else if (this.getType(json) == 'Array'){
   console.log('Array類型')
  } 

4. 補(bǔ)充 Array.isArray() 方法

js中的isArray()是Array類型的一個(gè)靜態(tài)方法,使用它可以判斷一個(gè)值是否為數(shù)組。 返回一個(gè)布爾值。

var arr = [1,2,3]
console.log(Array.isArray(arr))  //true

該方法可直接返回布爾值,在條件表達(dá)式中,使用該方法非常實(shí)用。

5. 總結(jié)

js數(shù)據(jù)類型的判斷主要有三種方法: typeof ,instanceof,Object.prototype.toString.call()

typeof可以區(qū)分 原始類型,undfined和 function 數(shù)據(jù)類型;

instanceof運(yùn)算符適合判斷對(duì)象數(shù)據(jù)類型,不適用原始類型的值。instanceof的原理是基于原型鏈的查詢,只要處于原型鏈中,判斷永遠(yuǎn)為true;

區(qū)分自定義對(duì)象類型使用 instanceof 操作符;

null instanceof Object,返回false,因?yàn)镺bject不在null原型鏈上;

Object.prototype.toString.call() 區(qū)分的數(shù)據(jù)類型適用范圍更大,但是無法區(qū)分自定義對(duì)象類型;

判斷數(shù)據(jù)類型方法有很多,實(shí)際使用需要根據(jù)自己的需求使用最適合自己的方法;

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

相關(guān)文章

  • 第一次接觸神奇的Bootstrap基礎(chǔ)排版

    第一次接觸神奇的Bootstrap基礎(chǔ)排版

    第一次接觸神奇的Bootstrap基礎(chǔ)排版,Bootstrap讓W(xué)eb開發(fā)更迅速、更簡單,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 微信小程序+mqtt,esp8266溫濕度讀取的實(shí)現(xiàn)方法

    微信小程序+mqtt,esp8266溫濕度讀取的實(shí)現(xiàn)方法

    這篇文章主要介紹了微信小程序+mqtt,esp8266溫濕度讀取的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • Bootstrap CSS布局之代碼

    Bootstrap CSS布局之代碼

    這篇文章主要介紹了Bootstrap CSS布局之代碼的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JavaScript分頁組件使用方法詳解

    JavaScript分頁組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了JavaScript分頁組件使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • JavaScript利用canvas實(shí)現(xiàn)炫酷的碎片切圖效果

    JavaScript利用canvas實(shí)現(xiàn)炫酷的碎片切圖效果

    這篇文章主要和大家分享一個(gè)炫酷的碎片式切圖效果,本文主要利用canvas來實(shí)現(xiàn),代碼量不多,但有些地方還是需要花點(diǎn)時(shí)間去理解的,感興趣的可以學(xué)習(xí)一下
    2022-10-10
  • 前端JavaScript根據(jù)文件url下載到本地多種方法實(shí)現(xiàn)

    前端JavaScript根據(jù)文件url下載到本地多種方法實(shí)現(xiàn)

    在現(xiàn)代網(wǎng)頁開發(fā)中,下載文件的功能常常會(huì)用到,尤其是在數(shù)據(jù)處理、報(bào)表下載等場景下,前端開發(fā)者常常需要將生成的數(shù)據(jù)以文件的形式保存在用戶的本地電腦上,這篇文章主要給大家介紹了關(guān)于前端JavaScript根據(jù)文件url下載到本地的多種方法實(shí)現(xiàn),需要的朋友可以參考下
    2025-07-07
  • uniapp打開地圖直接獲取位置的實(shí)現(xiàn)代碼

    uniapp打開地圖直接獲取位置的實(shí)現(xiàn)代碼

    這篇文章主要介紹了uniapp打開地圖直接獲取位置的實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-08-08
  • js獲取標(biāo)簽元素data-*屬性值的4種方法

    js獲取標(biāo)簽元素data-*屬性值的4種方法

    這篇文章主要分享了js獲取標(biāo)簽元素data-*屬性值的4種方法,標(biāo)簽上有兩個(gè)屬性??data-id????和???data-user-name??,?需要通過js去獲取,下面文章具體介紹需要的小伙伴可以參考一下
    2022-06-06
  • 一個(gè)非常全面的javascript URL解析函數(shù)和分段URL解析方法

    一個(gè)非常全面的javascript URL解析函數(shù)和分段URL解析方法

    本文詳細(xì)介紹了一個(gè)非常全面的javascript URL解析函數(shù),可以解析一個(gè)URL中的協(xié)議、主機(jī)、查詢字符串甚至錨鏈接,非常實(shí)用,一并總結(jié)了js自帶的分段URL解析方法,需要的朋友可以參考下
    2014-04-04
  • JavaScript中嚴(yán)格判斷NaN的方法

    JavaScript中嚴(yán)格判斷NaN的方法

    這篇文章主要介紹了JavaScript中嚴(yán)格判斷NaN的方法,非常不錯(cuò),具有參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-02-02

最新評(píng)論

长武县| 大竹县| 安陆市| 渭南市| 高雄县| 青铜峡市| 延庆县| 聂拉木县| 乌鲁木齐市| 凤山市| 来凤县| 荃湾区| 廊坊市| 马山县| 合江县| 蒙山县| 手游| 遂平县| 黑水县| 陆良县| 北碚区| 班戈县| 金昌市| 威信县| 洛扎县| 淅川县| 突泉县| 新乐市| 合水县| 谢通门县| 康马县| 河南省| 祁门县| 克东县| 新昌县| 杭锦后旗| 鄂尔多斯市| 浮梁县| 台北县| 焦作市| 大方县|