摘要:用來檢測數(shù)據(jù)類型的運算符語法雖然是基本數(shù)據(jù)類型值,但是它屬于空對象指針,檢測的結(jié)果是對象使用有自己的局限性,不能具體細分當前的值是數(shù)組還是正則也就是不能細分對象類型的值先算檢測某一個實例是否屬于某各類的實例構(gòu)造函數(shù)使用檢測某個值是否屬于某
typeof
用來檢測數(shù)據(jù)類型的運算符
語法:typeof[value]
typeof 12 //=>"number" typeof NaN //=>"number" typeof ""=>"string" var flag=true; typeof flag //"boolen" tpeof undefined //=>"undefined" function fn(n,m){ if(typeof n==="undefined"){ } } typeof null //=>"object" //雖然是基本數(shù)據(jù)類型值,但是它屬于空對象指針,檢測的結(jié)果是對象 typeof {} //=>"object" typeof function(){} //=>"function" typeof [] //=>"object" typeof /^$/ //=>"object" //使用typeof有自己的局限性,不能具體細分當前的值是數(shù)組還是正則(也就是不能細分對象類型的值) typeof (1>1?0:2) //=>"number" typeof 1>1?0:2 //=>先算typeof 1-> "number"=> "number">1?0:2 typeof typeof [] //=>"string" //=>typeof [] "object" //type of "object" =>"string"instanceof & constructor
instanceof : 檢測某一個實例是否屬于某各類的實例
constructor : 構(gòu)造函數(shù)使用instanceof 檢測某個值是否屬于某一個數(shù)據(jù)類型的內(nèi)置類,從而檢測出它是否是這個類型的值;使用instanceof可以實現(xiàn)typeof實現(xiàn)不了的,對對象類型值詳細的區(qū)分檢測;
[] instanceof Array //=>true [] instanceof RegExp //=>false
使用instanceof檢測也有自己的弊端:
1.基本類型值無法基于它的檢測
var num =12; num.toFixed(2) =>"12.00" //12是Number類的一個實例,可以調(diào)取Number.prototype上的方法,但是它是基本類型值 var num2=new Number(12); num2.toFixed(2) =>"12.00" typeof num //=>"number" typeof num2//=>"object" //不管是哪一種方式創(chuàng)建基本類型值,都是自己所屬類的實例(只不過類型不一樣而已) num instanceof Number //=>false num2 instanceof Number //=>true
2.instanceof 檢測的原理是基于原型鏈檢測的:只要當前類在實例的原型鏈上,最后返回的結(jié)果都是true.
var ary=[]; ary instanceof Array //=>true ary instanceof Object //=>true function Fn(){} Fn.prototype=new Array();//=>原型繼承(Fn 是Array的子類) var f=new Fn(); f instanceof Array //=>true 但是f其實不是數(shù)組,雖然在它的原型上可以找到數(shù)組,但是它不具備數(shù)組的基礎(chǔ)結(jié)構(gòu),這也是instanceof的弊端constructor
獲取當前檢測數(shù)據(jù)值的constructor,判斷它是否是某一個數(shù)據(jù)類型內(nèi)置類來檢測
var ary=[]; ary.constructor===Array //=>true ary.constructor===RegExp //=>false ary.constructor===Object //=>false ary.constructor="AA" ary.constructor===Array; //false //=>constructor檢測數(shù)據(jù)類型非常不可靠,因為這個屬性是經(jīng)常容易被修改的。Object.prototype.toString.call
獲取Object.prototype上的toString方法,讓方法中的this變?yōu)樾枰獧z測的數(shù)據(jù)類型值,并且讓方法執(zhí)行在Number、String、Boolean、Array、Function、RexExp...這些類的原型上都有一個toString方法:這個方法就是將自身的值轉(zhuǎn)換為字符串的
(12).toString() //=>"12" (true).toString() //=>"true" [12,23].toString() //=>"12,23" ...
在Object這個類的原型上也有一個方法toString,但是這個方法并不是把值轉(zhuǎn)換為字符串,而是返回當前值的所屬類詳細信息[object 所屬的類]
var obj={name:"tom"} obj.toString() //=>"[object Object]" 調(diào)取的是Object.prototype.toString /* *obj.toString() * 首先執(zhí)行Object.prototype.toString 方法 * 這個方法的this就是我們操作的數(shù)據(jù)值obj * =>總結(jié):Object.prototype.toString執(zhí)行的時候會返回當前方法中的this的所屬類信息 * * 也就是,我們想知道誰是所屬類信息,我們就把這個toString方法執(zhí)行,并且讓this變?yōu)槲覀儥z測的這個數(shù)據(jù)值,那么方法返回的結(jié)果就是當前檢測這個值的所屬類信息 * Object.prototype.toString.call([value]) * ({}).toString.call([value]) * */
Object.prototype.toString.call(12) //=>"[object Number]" Object.prototype.toString.call(true) //=>"[object Boolean]" Object.prototype.toString.call("") //=>"[object String]" Object.prototype.toString.call({}) //=>"[object Object]" Object.prototype.toString.call(null) //=>"[object Null]" Object.prototype.toString.call([]) //=>"[object Array]" Object.prototype.toString.call(/^$/) //=>"[object RegExp]" Object.prototype.toString.call(function(){}) //=>"[object Function]"
使用toString檢測數(shù)據(jù)類型,不管你是什么類型值,都可以正常檢測出需要的結(jié)果(這個方法檢測是萬能的)
alert({name:"tom"}) //[object Object] alert()=>轉(zhuǎn)換為字符串彈出 //如果彈對象字符串 alert(JSON.stringify({name:"tom"}))檢測數(shù)據(jù)類型方法封裝
~function(){ let obj={ isNumber:"Number", isString:"String", isBoolean:"Boolean", isNull:"Null", isUndefined:"Undefined", isPlanObject:"Object", isArray:"Array", isRegExp:"RegExp", isFunction:"Function" } let check={}; for (let key in obj) { if (obj.hasOwnProperty(key)) { check[key]=(function(classValue){ return function(val){ return new RegExp("[object "+classValue+"]").test(Object.prototype.toString.call(val)) } })(obj[key]) } } window.check=check; }()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/102503.html
摘要:專題系列共計篇,主要研究日常開發(fā)中一些功能點的實現(xiàn),比如防抖節(jié)流去重類型判斷拷貝最值扁平柯里遞歸亂序排序等,特點是研究專題之函數(shù)組合專題系列第十六篇,講解函數(shù)組合,并且使用柯里化和函數(shù)組合實現(xiàn)模式需求我們需要寫一個函數(shù),輸入,返回。 JavaScript 專題之從零實現(xiàn) jQuery 的 extend JavaScritp 專題系列第七篇,講解如何從零實現(xiàn)一個 jQuery 的 ext...
摘要:運算符可以用來檢測某個構(gòu)造函數(shù)的屬性是否存在于另外一個要檢測對象的原型鏈上。使用方法可以獲取到變量的準確的數(shù)據(jù)類型就能解決基本包裝類型的檢測錯誤和的檢測不安全。 本文共 1750 字,讀完只需 7 分鐘 數(shù)據(jù)類型有哪些? ECMAScript 的數(shù)據(jù)類型分為簡單數(shù)據(jù)類型(也被稱為基本數(shù)據(jù)類型,原始數(shù)據(jù)類型): Undefined Null String Number Boolean ...
摘要:專題系列第四篇,講解類型判斷的各種方法,并且跟著寫一個函數(shù)。返回值為表示操作數(shù)類型的一個字符串??紤]到實際情況下并不會檢測和,所以去掉這兩個類型的檢測。 JavaScript專題系列第四篇,講解類型判斷的各種方法,并且跟著 jQuery 寫一個 type 函數(shù)。 前言 類型判斷在 web 開發(fā)中有非常廣泛的應(yīng)用,簡單的有判斷數(shù)字還是字符串,進階一點的有判斷數(shù)組還是對象,再進階一點的有判...
摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
閱讀 3608·2023-04-26 02:24
閱讀 942·2023-04-25 14:47
閱讀 2514·2021-11-24 11:16
閱讀 1731·2021-11-24 09:38
閱讀 1583·2021-11-18 10:07
閱讀 2072·2021-09-22 15:49
閱讀 1599·2019-08-30 15:55
閱讀 890·2019-08-26 13:38