成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS中如何準(zhǔn)確判斷數(shù)據(jù)類型

KitorinZero / 2979人閱讀

摘要:對(duì)于此處的類型都是實(shí)例后的對(duì)象,并不會(huì)深入識(shí)別他們的構(gòu)造函數(shù)這里不是數(shù)據(jù)類型。通過(guò)上面的判斷,我們知道它并不能滿足一些內(nèi)置構(gòu)造函數(shù)創(chuàng)建的偽類型。

在我的第一篇文章里,介紹過(guò)JS各大類型并使用typeof進(jìn)行輸出查看.也有提到過(guò)每個(gè)函數(shù)都有一個(gè)自己的內(nèi)部屬性[[class]],這個(gè)class指的是js內(nèi)部分類.這個(gè)類的大致包括:數(shù)據(jù)類型構(gòu)造函數(shù)這兩種。

JavaScript類型介紹

我們講過(guò)JS的幾大數(shù)據(jù)類型,也用typeof查看了幾個(gè)簡(jiǎn)單的數(shù)據(jù)類型值。那么今天我們?cè)賮?lái)更寬泛的了解一下這方面的知識(shí)。請(qǐng)看如下代碼。
var num = 123;
var str = "aflypig";
var bool = true;
var arr = [1, 2, 3, 4];
var obj = {name:"aflypig", age:21};
var func = function(){ console.log("this is function"); }
var und = undefined;
var nul = null;
var date = new Date();
var reg = /^[a-zA-Z]{5,20}$/;
var error= new Error(); 

顯然,上次我們只用typeof查看了幾個(gè)常用的數(shù)據(jù)類型,但這次多了一些內(nèi)置構(gòu)造函數(shù),還有Array(上次特意沒(méi)講Array)類型。那么步入正題,我們?cè)鯓硬拍軠?zhǔn)確得獲得這些(再?gòu)?qiáng)調(diào)一次,這里不是變量,JS當(dāng)中衡量類型的是值,變量是儲(chǔ)存值的容器)數(shù)據(jù)類型呢?

其實(shí),一共有四種方法,但能完全準(zhǔn)確地識(shí)別出它們的只有一種方法,這也是面試過(guò)程中屢見不鮮的一道題。

如果判斷不同類型 typeof
   typeof num //number
   typeif str //string
   typeof bool //boolean
   typeof arr //object
   typeof obj //object
   typeof func//function
   typeof und //undefined
   typeof nul //object
   typeof date //object
   tyepof reg //object
   tyoeof error //object

解析:typeof可以識(shí)別簡(jiǎn)單基本類型值(比如:number,string,boolean),但對(duì)于復(fù)合類型(Object,Array,Function)卻只能識(shí)別Function。

                    undefined和null本身就是JS一直以來(lái)的bug,此處typeof `undefined`可以識(shí)別出正確的類型值,但null被歸類到`Object`大家庭中。
        對(duì)于此處的 date && reg && error 類型都是實(shí)例后的對(duì)象,typeof并不會(huì)深入識(shí)別他們的`構(gòu)造函數(shù)`(這里不是數(shù)據(jù)類型)。顯然typeof并不能處理這種復(fù)雜的類型。

總結(jié):typeof可以看作JS內(nèi)部已經(jīng)定義好的各個(gè)類型返回其對(duì)應(yīng)的字符串,它不深入值本身,不進(jìn)行類型轉(zhuǎn)換,只針對(duì)于當(dāng)前值返回其對(duì)應(yīng)的類型值。同樣的數(shù)據(jù)類型通過(guò)typeof運(yùn)算符運(yùn)算都是一樣的,它沒(méi)有原理可言,JS就是這樣定義的,我們只管記死它。

instanceof
通過(guò)上面的typeof判斷,我們知道它并不能滿足一些內(nèi)置構(gòu)造函數(shù)創(chuàng)建的偽類型。那么,我們這里來(lái)使用 constructor 查看他們的構(gòu)造函數(shù),從而分辨它們的類型。
   num instanceof Number  //false
   str instanceof String   //false
   bool instanceof Boolean   //false
  
        arr instanceof Array  //true
    obj instaneof Object  //true
    func instanceof Function  //true
        und instanceof  Object   //false
        nul instanceof   Object  //false
        date instanceof Date //true
    reg instanceof RegExp //true
    error instanceof Error //true

解析:這里我們使用instanceof來(lái)復(fù)合判斷的是否為對(duì)應(yīng)類型。首先,我們先看false項(xiàng),num str bool 這三個(gè)在使用instanceof 時(shí)并沒(méi)有包裝封裝對(duì)象且instanceof則是根據(jù)

constructor
  num.constructor .name    //Numer
  str.constructor.name  //String
  bool.constructor.name  //Boolean
  arr.constructor.name  //Array
  obj.constructor.name  //Objeact
  func.constructor.name  //Function
  und.constructor.name  // TypeError
  nul.constructor.name  //TypeError
  date.constructor.name //Date
  reg.constructor.name // RegExp
  error.constructor.name //Error
上面除了undefined 和 null 類型錯(cuò)誤(兩者都沒(méi)有屬性值)之外, 其他都可以獲得我們想要的數(shù)據(jù)類型。但實(shí)際真的如此嗎?
 
  // 1??
  var Structure =  function (){ }
  
  var ins = new Structure();
 
  ins.constructor.name  //Structure 
 
 //2??
  
   var Person = function(){}
   var Student = function(){}
   
   Person.prototype = new Student();
   var obj = new Person();
   
   obj.constructor === Student
 

解析:第一種情況,對(duì)于通過(guò)我們的構(gòu)造函數(shù)生成的實(shí)例,不能準(zhǔn)確得獲得其對(duì)應(yīng)得類型名稱,這一點(diǎn)恐怕就已經(jīng)遏制了我們使用這種方式。

                    第二種情況,由于對(duì)象的構(gòu)造函數(shù)是`可變的`,`不準(zhǔn)確的`,我們還是無(wú)法準(zhǔn)確的通過(guò)constructor獲得具體的類型.
        
        

總結(jié):通過(guò)constructor我們可以得到 instance不能得到的 str num bool 這些基本類型值,但另一個(gè)問(wèn)題又浮現(xiàn)出來(lái),constructor的可變性,由于它的不確定性,我們?cè)诤芏嗲闆r下都無(wú)法判斷出正確的數(shù)據(jù)類型,所以使用constructor這個(gè)方法也差不多廢了....

[[Class]]

解析:此[[class]]指的是隱藏在javascript內(nèi)部的分類屬性,它不可讀,不可枚舉,不可修改,不可配置。(兩邊出現(xiàn)__下劃線__的屬性都屬于部分瀏覽器支持的屬性。[[]]兩個(gè)中括號(hào)括起來(lái)的屬性屬于JavaScript內(nèi)部屬性。),我記得上一章說(shuō)過(guò),JavaScript中一切皆為對(duì)象的理念,我們可以強(qiáng)制把它轉(zhuǎn)換成字符串,使它暴露出內(nèi)部的[[class]]屬性。

了解了以上各種方法,我們發(fā)現(xiàn)它們只能完成部分的類型驗(yàn)證,有些情況是可變和不準(zhǔn)確的。

Object.prototype.toString.call(num);   //  "[object Number]"
Object.prototype.toString.call(str);   //  "[object String]"
Object.prototype.toString.call(bool);  //  "[object Boolean]"
Object.prototype.toString.call(arr);   //  "[object Array]"
Object.prototype.toString.call(func);  //  "[object Function]"
Object.prototype.toString.call(und);   //  "[object Undefined]"
Object.prototype.toString.call(nul);   //  "[object Null]"
Object.prototype.toString.call(date);  //  "[object Date]"
Object.prototype.toString.call(reg);   //  "[object RegExp]"
Object.prototype.toString.call(error);  //  "[object Error]"
 
arr instanceof Array  //true
    obj instaneof Object  //true
    func instanceof Function  //true
        und instanceof  Object   //false
        nul instanceof   Object  //false
        date instanceof Date //true
    reg instanceof RegExp //true
    error instanceof Error //true

我們通過(guò) Object 的 toString 方法來(lái)查看了當(dāng)前對(duì)象的數(shù)據(jù)類型,我們看到使用這種方式可以完美的查看對(duì)應(yīng)的數(shù)據(jù)類型,正是我們想要的,而且每個(gè)對(duì)象都有屬于自己的[[class]],我們可以理解為,它是JavaScript根據(jù)內(nèi)置構(gòu)造函數(shù)做出的內(nèi)部分類。

對(duì)于這種經(jīng)常使用原生js又難以需求的情況下,怎么能少得了jqquery呢?

以下是與jQuery.type()函數(shù)相關(guān)的jQuery示例代碼:

jQuery.type( undefined ); // "undefined"
jQuery.type( null ); // "null"
 
jQuery.type( true ); // "boolean"
jQuery.type( new Boolean(true) ); // "boolean"
 
jQuery.type( 3 ); // "number"
jQuery.type( new Number(3) ); // "number"
 
jQuery.type( "test" ); // "string"
jQuery.type( new String("test") ); // "string"
 
jQuery.type( function(){} ); // "function"
jQuery.type( new Function() ); // "function"
 
jQuery.type( [] ); // "array"
jQuery.type( new Array() ); // "array"
 
jQuery.type( new Date() ); // "date"
 
jQuery.type( new Error() ); // "error" // jQuery 1.9 新增支持
 
jQuery.type( /test/ ); // "regexp"
jQuery.type( new RegExp("d+") ); // "regexp"
 

jquery內(nèi)部也是通過(guò)我們剛才說(shuō)到的 [[class]]的方式實(shí)現(xiàn)的,它返回一個(gè)字符串,固定為小寫字母。
我們可以寫行代碼,來(lái)簡(jiǎn)單的實(shí)現(xiàn)jquery中的type方法

function type(o){
    var s  = Object.prototype.toString.call(o);
    return s.slice(s.indexOf(" ")+1,s.length-1).toLowerCase();
}
 

type(false) //boolean
type({}) //object
type([]) //array
type("") //string
type(/^/) //regexp

 
希望通過(guò)本次粗淺的講解能給大家?guī)?lái)一點(diǎn)收獲,在知道最終有適合的方式時(shí),應(yīng)該多去考慮使用另外的方式去實(shí)現(xiàn)的手段,因?yàn)樽鲞@樣可以擴(kuò)展自己的知識(shí)范圍。就比如上文,如果從后向前列舉,我想有很多人都不會(huì)去思考 constructor 和 instance 的不足以及他們的適用范圍吧,
 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/83090.html

相關(guān)文章

  • Js基礎(chǔ)知識(shí)(一) - 變量

    摘要:內(nèi)置函數(shù)和對(duì)象中內(nèi)置了一些函數(shù)和對(duì)象,很多語(yǔ)言都會(huì)有內(nèi)置的方法,直接可以調(diào)用開發(fā)。根據(jù)語(yǔ)法標(biāo)準(zhǔn)提供的內(nèi)置函數(shù)包括和。注意基礎(chǔ)語(yǔ)法提供的內(nèi)置函數(shù)和方法只有這些,像那是瀏覽器提供給我們的。強(qiáng)制類型轉(zhuǎn)換大家應(yīng)該都知道。 js基礎(chǔ) - 變量 *大家對(duì)js一定不會(huì)陌生,入門很簡(jiǎn)單(普通入門),很多人通過(guò)網(wǎng)絡(luò)資源、書籍、課堂等很多途徑學(xué)習(xí)js,但是有些js基礎(chǔ)的只是往往被大家遺漏,本章就從js變量...

    leone 評(píng)論0 收藏0
  • Js基礎(chǔ)知識(shí)(一) - 變量

    摘要:內(nèi)置函數(shù)和對(duì)象中內(nèi)置了一些函數(shù)和對(duì)象,很多語(yǔ)言都會(huì)有內(nèi)置的方法,直接可以調(diào)用開發(fā)。根據(jù)語(yǔ)法標(biāo)準(zhǔn)提供的內(nèi)置函數(shù)包括和。注意基礎(chǔ)語(yǔ)法提供的內(nèi)置函數(shù)和方法只有這些,像那是瀏覽器提供給我們的。強(qiáng)制類型轉(zhuǎn)換大家應(yīng)該都知道。 js基礎(chǔ) - 變量 *大家對(duì)js一定不會(huì)陌生,入門很簡(jiǎn)單(普通入門),很多人通過(guò)網(wǎng)絡(luò)資源、書籍、課堂等很多途徑學(xué)習(xí)js,但是有些js基礎(chǔ)的只是往往被大家遺漏,本章就從js變量...

    MageekChiu 評(píng)論0 收藏0
  • JS類型(三):JS類型檢查

    摘要:正文一基本類型檢測(cè)為什么說(shuō)是基本類型檢測(cè)對(duì)于這三種類型經(jīng)常用到的基本類型檢測(cè)是正確的。為什么說(shuō)是更好的檢測(cè)方法上面的兩種方法要么是只能檢測(cè)基本類型,要么是只能檢測(cè)引用類型,還存在不支持檢測(cè)的情況。 前言 前兩篇文章主要是一直在討論JS類型的轉(zhuǎn)換,那么怎么才能檢測(cè)JS的數(shù)據(jù)類型呢?檢測(cè)數(shù)據(jù)類型在工程中經(jīng)常用到,常見的JS類型檢測(cè)有三種方法: 1. typeof 2. instanceof...

    ad6623 評(píng)論0 收藏0
  • 判斷是否是數(shù)組的幾種方法— (js基礎(chǔ)復(fù)習(xí)第1期)

    摘要:如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí)際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境,從而存在兩個(gè)以上不同版本的構(gòu)造函數(shù)。如果你從一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。 1. 首先,typeof肯定是不行的 對(duì)于一些基本類型,typeof是可以判斷出數(shù)據(jù)類型,但是判斷一些引用類型時(shí)候,不能具體到具體哪一種類型 再來(lái)復(fù)習(xí)一下typeof的...

    supernavy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<