日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

JavaScript类型判断

發(fā)布時(shí)間:2025/3/21 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript类型判断 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JS(ES6)中的基本數(shù)據(jù)類(lèi)型:1.數(shù)值型(Number):包括整數(shù)、浮點(diǎn)數(shù)、2.布爾型(Boolean)、3.字符串型(String)、4.數(shù)組(Array)、5.空值(Null) 、6.未定義(Undefined),基本數(shù)據(jù)類(lèi)型是按值訪問(wèn)的,因?yàn)榭梢灾苯硬僮鞅4嬖谧兞恐械膶?shí)際值。
引用類(lèi)型:Object 、Array 、Function 、Data,引用數(shù)據(jù)類(lèi)型是保存在堆內(nèi)存中的對(duì)象

1.typeof

var a; console.log("1:" + typeof a); var b = null; console.log("2:" + typeof b); var c = undefined; console.log("3:" + typeof c); var d = new Object; console.log("4:" + typeof d); var e = function() {}; console.log("5:" + typeof e); var f = {}; console.log("6:" + typeof f); var g = ''; console.log("7:" + typeof g); var h = []; console.log("8:" + typeof h); var i = true; console.log("9:" + typeof i); var j = 123; console.log("10:" + typeof j); var k = NaN; console.log("11:" + typeof k); var l = /^[-+]?\d+$/; console.log("12:" + typeof l);

打印結(jié)果如下

總結(jié):typeof對(duì)null、undefined、NaN、數(shù)組、正則、Object的類(lèi)型都為object


2.constructor

constructor 用于判斷一個(gè)變量的原型,constructor 屬性返回對(duì)創(chuàng)建此對(duì)象的數(shù)組函數(shù)的引用.
當(dāng)一個(gè)函數(shù) F被定義時(shí),JS引擎會(huì)為F添加 prototype 原型,然后再在 prototype上添加一個(gè) constructor 屬性,并讓其指向 F 的引用,當(dāng)執(zhí)行 var f = new F() 時(shí),F 被當(dāng)成了構(gòu)造函數(shù),f 是F的實(shí)例對(duì)象,此時(shí) F 原型上的 constructor 傳遞到了 f 上,因此 f.constructor === F var F = function(){} console.log(F.prototype); var f = new F(); console.log(f.constructor===F) //true

不難看出,F 利用原型對(duì)象上的 constructor 引用了自身,當(dāng) F 作為構(gòu)造函數(shù)來(lái)創(chuàng)建對(duì)象時(shí),原型上的 constructor 就被遺傳到了新創(chuàng)建的對(duì)象上, 從原型鏈角度講,構(gòu)造函數(shù) F 就是新對(duì)象的類(lèi)型。這樣做的意義是,讓新對(duì)象在誕生以后,就具有可追溯的數(shù)據(jù)類(lèi)型,也就是說(shuō)對(duì)象的constructor屬性指向他的構(gòu)造函數(shù)

所以?xún)?nèi)置對(duì)象在內(nèi)部構(gòu)建時(shí)闊以這樣做出判斷

  • null 和 undefined 是無(wú)效的對(duì)象,因此是不會(huì)有 constructor 存在的,這兩種類(lèi)型的數(shù)據(jù)需要通過(guò)其他方式來(lái)判斷
  • constructor屬性并非一定指向構(gòu)造函數(shù),他也是可以修改、變更的(當(dāng)把F.prototype = {}改寫(xiě)后,會(huì)默認(rèn)把constructor覆蓋掉)

instanceof

instanceof 運(yùn)算符用來(lái)測(cè)試一個(gè)對(duì)象在其原型鏈中是否存在一個(gè)構(gòu)造函數(shù)的 prototype 屬性 及的構(gòu)造函數(shù)有這些基礎(chǔ)類(lèi)型:String、Number、Boolean、Undefined、Null、Symbol(ES6引入了一種新的原始數(shù)據(jù)類(lèi)型Symbol,表示獨(dú)一無(wú)二的值); 復(fù)雜類(lèi)型:Array,Object; 其他類(lèi)型:Function、RegExp、Date。 var obj = new Object() obj instanceof Object // true

注意左側(cè)必須是對(duì)象(object),如果不是,直接返回false,列如:

var num = 1 num instanceof Number // falsenum = new Number(1) num instanceof Number // true

可以看出都是num,而且都是1,只是因?yàn)榈谝粋€(gè)不是對(duì)象,是基本類(lèi)型,所以直接返回false,而第二個(gè)是封裝成對(duì)象,所以true。
這里要嚴(yán)格注意這個(gè)問(wèn)題,有些說(shuō)法是檢測(cè)目標(biāo)的__proto__與構(gòu)造函數(shù)的prototype相同即返回true,這是不嚴(yán)謹(jǐn)?shù)?#xff0c;檢測(cè)的一定要是對(duì)象才行,如:

基礎(chǔ)類(lèi)型

var num = 1 num.__proto__ === Number.prototype // true num instanceof Number // falsenum = new Number(1) num.__proto__ === Number.prototype // true num instanceof Number // true num.__proto__ === (new Number(1)).__proto__ // true

上面例子可以看出,1與new Number(1)幾乎是一樣的,只是區(qū)別在于是否封裝成對(duì)象,所以instanceof的結(jié)果是不同的,string、boolean等,這些基礎(chǔ)類(lèi)型一樣的。

new String(1) // String {"1"} String(1) // "1"

new String(1)與String(1)是不同的,new是封裝成對(duì)象,而沒(méi)有new的只是基礎(chǔ)類(lèi)型轉(zhuǎn)換,還是基礎(chǔ)類(lèi)型
其他基礎(chǔ)類(lèi)型一樣的。

復(fù)雜類(lèi)型,比如數(shù)組與對(duì)象,甚至函數(shù)等,與基礎(chǔ)類(lèi)型不同。

復(fù)雜類(lèi)型

var arr = [] arr instanceof Array // true arr instanceof Object // true Array.isArray(arr) // true

復(fù)雜類(lèi)型從字面量是直接生成構(gòu)造函數(shù)的,所以不會(huì)像基本類(lèi)型一樣兩種情況。
但是上面那個(gè)問(wèn)題,當(dāng)然,基礎(chǔ)類(lèi)型也會(huì)有這個(gè)問(wèn)題,就是與Object對(duì)比。沒(méi)辦法,Object在原型鏈的上層,所以都會(huì)返回true,如下:

(new Number(1)) instanceof Object // true

由于從下往上,比如你判斷是Number,那就沒(méi)必要判斷是不是Object了,因?yàn)橐呀?jīng)是Number了……

其他類(lèi)型

var reg = new RegExp(//) reg instanceof RegExp // true reg instanceof Object // truevar date = new Date() date instanceof Date // true date instanceof Object // true除了Function,都一樣,具體Function如下:function A() {} var a = new A() a instanceof Function // false a instanceof Object // true A instanceof Function // true

這里要注意,function A() {}相當(dāng)于var A; A = function() {},然后分析:

  • a是new出來(lái),所以是經(jīng)過(guò)構(gòu)造,因此已經(jīng)是對(duì)象,不再是函數(shù),所以false
  • a是經(jīng)過(guò)構(gòu)造的對(duì)象,返回ture沒(méi)問(wèn)題
  • A是個(gè)函數(shù),這沒(méi)什么問(wèn)題
  • {}.toString.call(obj)

    用法如下

    console.log({}.toString.call(1)); console.log({}.toString.call("11")); console.log({}.toString.call(/123/)); console.log({}.toString.call({})); console.log({}.toString.call(function() {})); console.log({}.toString.call([])); console.log({}.toString.call(true)); console.log({}.toString.call(new Date())); console.log({}.toString.call(new Error())); console.log({}.toString.call(null)); console.log({}.toString.call(undefined)); console.log(String(null)); console.log(String(undefined));

    返回如下

    注意:必須通過(guò) call 或 apply 來(lái)調(diào)用,而不能直接調(diào)用 toString , 從原型鏈的角度講,所有對(duì)象的原型鏈最終都指向了 Object, 按照J(rèn)S變量查找規(guī)則,其他對(duì)象應(yīng)該也可以直接訪問(wèn)到 Object 的 toString方法,而事實(shí)上,大部分的對(duì)象都實(shí)現(xiàn)了自身的 toString 方法,這樣就可能會(huì)導(dǎo)致 Object 的 toString 被終止查找,因此要用 call/apply 來(lái)強(qiáng)制調(diào)用Object 的 toString 方法

    jQuery中的方法$.type(),就是用到了toString

    type: function( obj ) {if ( obj == null ) {return obj + "";}// Support: Android<4.0, iOS<6 (functionish RegExp)return typeof obj === "object" || typeof obj === "function" ?class2type[ toString.call(obj) ] || "object" :typeof obj; },

    分析源代碼:

    typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ]

    通過(guò)判斷傳入類(lèi)型,如果是object或者function類(lèi)型就直接返回class2type 中鍵值是對(duì)的結(jié)果,如果不是,那么一定就是基本類(lèi)型, 通過(guò) typeof 就可以

    class2type[ toString.call(obj) ] || "object"

    這是為了防止一些未知情況的,如果未取到,就返回object,保證了程序可用性

    參考文章:
    JS類(lèi)型判斷,typeof/constructor/instanceof的區(qū)別
    js中的constructor和prototype
    JS類(lèi)型判斷
    jquery源碼
    揭開(kāi)js之constructor屬性的神秘面紗

    總結(jié)

    以上是生活随笔為你收集整理的JavaScript类型判断的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。