JS區(qū)分Object與Aarry的六種方法總結(jié)
一、經(jīng)常遇見(jiàn)的問(wèn)題:
JS中判斷一個(gè)對(duì)象的類型時(shí),通常使用typeof,這時(shí)候問(wèn)題就來(lái)了,因?yàn)閠ypeof()辨別數(shù)組的時(shí)候返回的是object,所以JS
中判斷一個(gè)對(duì)象是不是數(shù)組需要一些特殊的處理方式,下面將介紹個(gè)人總結(jié)的六種處理方法。
二、開(kāi)門見(jiàn)山
開(kāi)發(fā)中要判斷一個(gè)對(duì)象是不是數(shù)組,推薦使用下面這個(gè)函數(shù):
function isArray(obj){ if(Array.isArray){ return Array.isArray(obj); }else{ return Object.prototype.toString.call(obj)==="[object Array]"; } }
上面這個(gè)函數(shù)是方便急于解決問(wèn)題的人,下面我將具體述說(shuō)六種方法,因?yàn)榭赡苊嬖嚨臅r(shí)候考官需要一個(gè)知識(shí)全面的你;
三、六種方案詳解:
(1)方法一:利用toString方法
通過(guò)調(diào)用toString( )方法試著將該變量轉(zhuǎn)化為代表其類型的string。該方法對(duì)于真正的array可行;參數(shù)對(duì)象轉(zhuǎn)化為string時(shí)
返回[object Arguments]會(huì)轉(zhuǎn)化失??;此外, 對(duì)于含有數(shù)字長(zhǎng)度屬性的object類也會(huì)轉(zhuǎn)化失敗。
方法如下:
<!DOCTYPE html> <html> <head> <title>Array的判斷方法</title> <meta charset="utf-8"/> <script> function isArrayOne(arr){ return <span style="color:#cc0000;">Object.prototype.toString.call(arr) === "[object Array]";</span> } var obj = {"k1":"v1"}; var arr = [1,2]; console.log("對(duì)象的結(jié)果:"+isArrayOne(obj)); console.log("數(shù)組的結(jié)果:"+isArrayOne(arr)); </script> </head> <body> </body> </html>
結(jié)果如圖:
注意:推薦使用“===”全等于而不使用“==”等等于,因?yàn)樾矢撸?/p>
(2)方法二:通過(guò)isArray:
使用Javascript 1.8.5(ECMAScript 5),變量名字.isArray( )可以實(shí)現(xiàn)這個(gè)目的,前提是有支持這一函數(shù),其實(shí)isArray就是
方法一的封裝使用。
使用方法十分簡(jiǎn)單:
Array.isArray(obj); //obj是待檢測(cè)的對(duì)象
返回true或false,如果為true則為數(shù)組
(3)方法三:通過(guò)instanceof運(yùn)算符來(lái)判斷,
注意:instanceof運(yùn)算符左邊是子對(duì)象(待測(cè)對(duì)象),右邊是父構(gòu)造函數(shù)(這里是Array),
即:子對(duì)象 instanceof 父構(gòu)造函數(shù)
instance: 實(shí)例:凡是用new 構(gòu)造函數(shù)()創(chuàng)建出的對(duì)象,都稱為是構(gòu)造函數(shù)的實(shí)例
扯半天都迷糊了,還是直接看代碼好:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>Document</title> <script> var obj = {"k1":"v1"}; var arr = [1,2]; console.log("Instanceof處理對(duì)象的結(jié)果:"+(obj instanceof Array)); console.log("Instanceof處理數(shù)組的結(jié)果:"+(arr instanceof Array)); </script> </head> <body> </body> </html>
運(yùn)行結(jié)果如下:
(4)使用isPrototypeOf()函數(shù)
原理:檢測(cè)一個(gè)對(duì)象是否是Array的原型(或處于原型鏈中,不但可檢測(cè)直接父對(duì)象,還可檢測(cè)整個(gè)原型鏈上的所有父對(duì)象)
使用方法: parent.isPrototypeOf(child)來(lái)檢測(cè)parent是否為child的原型;
需注意的是isPrototypeOf()函數(shù)實(shí)現(xiàn)的功能和instancof運(yùn)算符非常類似;
具體代碼:
Array.prototype.isPrototypeOf(arr) //true表示是數(shù)組,false不是數(shù)組
(5)利用構(gòu)造函數(shù)constructor
具體代碼:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>Document</title> <script> var obj = {'k':'v'}; var t1 = new Array(1); var t2 = t1; console.log(obj.constructor == Array); console.log(t1.constructor == Array); console.log(t2.constructor == Array); </script> </head> <body> </body> </html>
結(jié)果如圖
(6)使用typeof(對(duì)象)+類型名結(jié)合判斷:
代碼如下:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Generator" content="EditPlus®"> <meta name="Author" content=""> <meta name="Keywords" content=""> <meta name="Description" content=""> <title>Document</title> <script> function isArrayFour(arr){ if(typeof(arr)==="object"){ if(arr.concat){ return "This is Array"; }else{ return "This Not Array"; } } } var arr = [1]; var obj = {'k':'v'}; console.log(typeof(arr)); console.log(typeof(obj)); console.log(isArrayFour(arr)); console.log(isArrayFour(obj)); </script> </head> <body> </body> </html>
結(jié)果如下:
這種方法其實(shí)有局限性,有的同學(xué)可能一下就破解了,那就是要是
要是對(duì)象中不巧定義了這屬性怎么辦
var obj = {'concat':'Teast me?'};
我只能說(shuō)哥你贏了?。?!
以上這篇JS區(qū)分Object與Aarry的六種方法總結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析
這篇文章主要介紹了JavaScript遞歸函數(shù)解“漢諾塔”算法代碼解析,需要的朋友可以參考下2018-07-07詳解JavaScript添加給定的標(biāo)簽選項(xiàng)
這篇文章給大家分享了JavaScript實(shí)現(xiàn)添加給定的標(biāo)簽選項(xiàng)的相關(guān)知識(shí)點(diǎn)內(nèi)容以及代碼實(shí)例,有興趣的朋友們參考下。2018-09-09詳解bootstrap-fileinput文件上傳控件的親身實(shí)踐
這篇文章主要介紹了詳解bootstrap-fileinput文件上傳控件的親身實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03JS實(shí)現(xiàn)數(shù)組去重方法總結(jié)(六種方法)
這篇文章給大家總結(jié)下JS實(shí)現(xiàn)數(shù)組去重方法(六種方法),面試中也經(jīng)常會(huì)遇到這個(gè)問(wèn)題。文中給大家引申的還有合并數(shù)組并去重的方法,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2017-07-07用js實(shí)現(xiàn)計(jì)算代碼行數(shù)的簡(jiǎn)單方法附代碼
用js實(shí)現(xiàn)計(jì)算代碼行數(shù)的簡(jiǎn)單方法附代碼...2007-08-08微信小程序網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求的實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了微信小程序網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求的實(shí)現(xiàn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Javascript節(jié)點(diǎn)關(guān)系實(shí)例分析
這篇文章主要介紹了Javascript節(jié)點(diǎn)關(guān)系,實(shí)例分析了javascript操作父子節(jié)點(diǎn)及兄弟節(jié)點(diǎn)的相關(guān)技巧,需要的朋友可以參考下2015-05-05JS中call和apply函數(shù)用法實(shí)例分析
這篇文章主要介紹了JS中call和apply函數(shù)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了call和apply函數(shù)繼承功能的使用方法、區(qū)別及操作注意事項(xiàng),需要的朋友可以參考下2018-06-06layui添加動(dòng)態(tài)菜單與選項(xiàng)卡 AJAX請(qǐng)求的例子
今天小編就為大家分享一篇layui添加動(dòng)態(tài)菜單與選項(xiàng)卡 AJAX請(qǐng)求的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09