欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js數(shù)據(jù)類(lèi)型檢測(cè)總結(jié)

 更新時(shí)間:2018年08月05日 11:13:11   作者:余大彬  
這篇文章給大家分享了js數(shù)據(jù)類(lèi)型檢測(cè)的相關(guān)實(shí)例內(nèi)容,有需要的朋友可以測(cè)試下。

在js中,有四種用于檢測(cè)數(shù)據(jù)類(lèi)型的方式,分別是:

  • typeof  用來(lái)檢測(cè)數(shù)據(jù)類(lèi)型的運(yùn)算符
  • instanceof    檢測(cè)一個(gè)實(shí)例是否屬于某個(gè)類(lèi)
  • constructor   構(gòu)造函數(shù)
  • Object.prototype.toString.call()  原型鏈上的Object對(duì)象的toString方法

下面我們就來(lái)分別介紹一下上面四種方法的適用場(chǎng)景和局限性。

typeof 用來(lái)檢測(cè)數(shù)據(jù)類(lèi)型的運(yùn)算符

使用typeof檢測(cè)數(shù)據(jù)類(lèi)型,返回值是字符串格式。能夠返回的數(shù)據(jù)類(lèi)型

是:"number","string","bolean","undefined","function","object"。

<script>
  console.log(typeof(1));  //number
  console.log(typeof('hello'));  //string
  console.log(typeof(true));  //boolean
  console.log(typeof(undefined));  //undefined
  console.log(typeof(null));  //object
  console.log(typeof({}));  //object
  console.log(typeof(function() {}));  //function
</script>

局限性:

  • typeof (null); //"object"。這是由于在js中,null值表示一個(gè)空對(duì)象指針,而這也正是使用typeof操作 符檢測(cè)null值時(shí)會(huì)返回"object"的原因。
  • 不能具體的細(xì)分是數(shù)組還是正則,還是對(duì)象中其他的值,因?yàn)槭褂胻ypeof檢測(cè)數(shù)據(jù)類(lèi)型,對(duì)于對(duì)象數(shù)據(jù)類(lèi)型的所有的值,最后返回的都是"object"

instanceof 檢測(cè)某一個(gè)實(shí)例是否屬于某個(gè)類(lèi)

instanceof主要用來(lái)彌補(bǔ)typeof不能檢測(cè)具體屬于哪個(gè)對(duì)象的局限性。

<script>
  let arr = [1,2,3];
  let reg = /\w/;
  console.log(arr instanceof Array);  //true
  console.log(arr instanceof Object);  //true
  console.log(reg instanceof RegExp);  //true
  console.log(reg instanceof Object);  //true
</script>

局限性:

  • 不能用于檢測(cè)和處理字面量方式創(chuàng)建出來(lái)的基本數(shù)據(jù)類(lèi)型值,即原始數(shù)據(jù)類(lèi)型
  • instanceof的特性:只要在當(dāng)前實(shí)例的原型鏈上的對(duì)象,我們用其檢測(cè)出來(lái)都為true
  • 在類(lèi)的原型繼承中,我們最后檢測(cè)出來(lái)的結(jié)果未必正確

constructor 構(gòu)造函數(shù)

是函數(shù)原型上的屬性,該屬性指向的是構(gòu)造函數(shù)本身。

作用和instsnceof非常相似,與instanceof不同的是,不僅可以處理引用數(shù)據(jù)類(lèi)型,還可以處理原始數(shù)據(jù)類(lèi)型。

<script>
  let num = 12;
  let obj = {};
  console.log(num.constructor == Number);//true
  console.log(obj.constructor == Object);//true
</script>

但是要注意一點(diǎn)的是,當(dāng)直接用(對(duì)象字面量或原始數(shù)據(jù)).constructor時(shí),最好加上()。為了便于理解,我們來(lái)看一個(gè)例子。

<script>
  1.constructor === Number;    //報(bào)錯(cuò),Invalid or unexceped token
  (1).constructor === Number;    //true
  {}.constructor === Number;    //報(bào)錯(cuò),Invalid or unexceped token
  ({}).constructor === Number;  //true
</script>

這主要是由于js內(nèi)部解析方式造成的,js會(huì)把1.constructor解析成小數(shù),這顯然是不合理的,小數(shù)點(diǎn)后應(yīng)該是數(shù)字,因此就會(huì)引發(fā)報(bào)錯(cuò)。js會(huì)把{}解析成語(yǔ)句塊來(lái)執(zhí)行,這時(shí)后面出現(xiàn)一個(gè)小數(shù)點(diǎn)顯然也是不合理的,因此也會(huì)報(bào)錯(cuò)。為了解決這個(gè)問(wèn)題,我們可以為表達(dá)式加上()使js能夠正確解析。

局限性:我們可以把類(lèi)的原型進(jìn)行重寫(xiě),在重寫(xiě)的過(guò)程中很可能把之前constructor給覆蓋了,這樣檢測(cè)出來(lái)的結(jié)果就是不準(zhǔn)確的

<script>
   function Fn() {};
  Fn.prototype = new Array;
  var f = new Fn;
  //f是一個(gè)函數(shù),按道理說(shuō)他的構(gòu)造函數(shù)應(yīng)該是Function,但是修改其原型鏈后,它的constructor變成了Array.
  console.log(f.constructor == Array);  //true
</script>

Object.prototype.toString.call() 原型鏈上的Object對(duì)象的toString方法

Object.prototype.toString的作用是返回當(dāng)前方法的執(zhí)行主體(方法中的this)所屬類(lèi)的詳細(xì)信息,是最全面也是最常用的檢測(cè)數(shù)據(jù)類(lèi)型的方式。

返回值的類(lèi)型為string類(lèi)型。

<script> 
  console.log(Object.prototype.toString.call(1));          //[object Number]
  console.log(Object.prototype.toString.call(/^sf/));        //[object RegExp]
  console.log(Object.prototype.toString.call("hello"));      //[object String]
  console.log(Object.prototype.toString.call(true));        //[object Boolean]
  console.log(Object.prototype.toString.call(null));        //[object Null]
  console.log(Object.prototype.toString.call(undefined));      //[object Undefined]
  console.log(Object.prototype.toString.call(function() {}));    //[object Function]
  console.log(typeof(Object.prototype.toString.call(function() {})));    //string
</script>

相關(guān)文章

  • JavaScript的詞法結(jié)構(gòu)精華篇

    JavaScript的詞法結(jié)構(gòu)精華篇

    今天小編就為大家分享一篇關(guān)于JavaScript的詞法結(jié)構(gòu)精華篇,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • 如何利用原生JS實(shí)時(shí)監(jiān)聽(tīng)input框輸入值

    如何利用原生JS實(shí)時(shí)監(jiān)聽(tīng)input框輸入值

    這篇文章主要介紹了如何利用原生JS實(shí)時(shí)監(jiān)聽(tīng)input框輸入值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • js實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)簡(jiǎn)單實(shí)例

    js實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)簡(jiǎn)單實(shí)例

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)簡(jiǎn)單實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • 原生js實(shí)現(xiàn)放大鏡

    原生js實(shí)現(xiàn)放大鏡

    本文主要分享了原生js實(shí)現(xiàn)放大鏡效果的示例代碼,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • confirm的用法示例用于按鈕操作時(shí)確定是否執(zhí)行

    confirm的用法示例用于按鈕操作時(shí)確定是否執(zhí)行

    這篇文章主要介紹了confirm的用法,confirm一般用于按鈕操作時(shí)確定是否執(zhí)行,需要的朋友可以參考下
    2014-06-06
  • 如何防止JavaScript中的正則表達(dá)式回溯

    如何防止JavaScript中的正則表達(dá)式回溯

    某些正則表達(dá)式模式可能容易受到回溯的影響,這可能會(huì)導(dǎo)致超線(xiàn)性運(yùn)行時(shí),并可能導(dǎo)致DoS攻擊,本文就來(lái)介紹一下如何防止JavaScript中的正則表達(dá)式回溯,感興趣的可以了解一下
    2023-08-08
  • 解決JavaScript精度問(wèn)題的常見(jiàn)方法

    解決JavaScript精度問(wèn)題的常見(jiàn)方法

    在 JavaScript 中,處理浮點(diǎn)數(shù)時(shí)經(jīng)常會(huì)遇到精度丟失的問(wèn)題,這是由于 JavaScript 內(nèi)部采用 IEEE 754 標(biāo)準(zhǔn)表示浮點(diǎn)數(shù),導(dǎo)致某些小數(shù)無(wú)法精確表示,本文將介紹一些常見(jiàn)的方法來(lái)解決 JavaScript 中的精度問(wèn)題,并討論它們的優(yōu)缺點(diǎn),需要的朋友可以參考下
    2024-05-05
  • js獲取form表單所有數(shù)據(jù)的簡(jiǎn)單方法

    js獲取form表單所有數(shù)據(jù)的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇js獲取form表單所有數(shù)據(jù)的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • 原生js實(shí)現(xiàn)貪食蛇小游戲的思路詳解

    原生js實(shí)現(xiàn)貪食蛇小游戲的思路詳解

    這篇文章主要介紹了原生js實(shí)現(xiàn)貪食蛇小游戲的思路詳解,,文中給大家寫(xiě)出了注釋?zhuān)瑤椭蠹依斫獯a,需要的朋友可以參考下
    2019-11-11

最新評(píng)論