判断一个变量类型是数组还是对象
數(shù)組或者對(duì)象的typeof 值都是object。
一、通過(guò)length
一般情況下對(duì)象沒(méi)有l(wèi)ength屬性值,其值為undefiend,而數(shù)組的length值為number類型。
缺點(diǎn):非常不實(shí)用,當(dāng)對(duì)象的屬性存在length,且其值為number(比如類數(shù)組),則該方法失效,不建議使用,看看即可。
二、驗(yàn)證構(gòu)造函數(shù)
1.instanceof :判斷一個(gè)實(shí)例是否由構(gòu)造函數(shù)(Array)創(chuàng)建出來(lái)
console.log(arr instanceof Array);//true console.log(json instanceof Array);//false2.對(duì)象的constructor屬性用于返回創(chuàng)建該對(duì)象的構(gòu)造函數(shù)。
console.log(arr.constructor===Array);//true console.log(json.constructor===Array);//false這種方法有2個(gè)問(wèn)題,
一、就是驗(yàn)證不夠嚴(yán)格。 即使對(duì)象創(chuàng)建時(shí)不是使用數(shù)組創(chuàng)建的,但是只要原型鏈上有數(shù)組類型,也認(rèn)為是數(shù)組,如下面一段代碼:
二、instanceof 和constructor 判斷的變量,必須在當(dāng)前頁(yè)面聲明的,比如,一個(gè)頁(yè)面(父頁(yè)面)有一個(gè)iframe,iframe中引用了一個(gè)頁(yè)面(子頁(yè)面),在子頁(yè)面中聲明了一個(gè)a,并將其賦值給父頁(yè)面的一個(gè)變量arr,這時(shí)判斷該變量, arr.constructor===Array 或arr instanceof Array都會(huì)返回false;
原因:
1、array屬于引用型數(shù)據(jù),在傳遞過(guò)程中,僅僅是引用地址的傳遞。
2、每個(gè)頁(yè)面的Array原生對(duì)象所引用的地址是不一樣的,在子頁(yè)面聲明的array,所對(duì)應(yīng)的構(gòu)造函數(shù),是子頁(yè)面的Array對(duì)象;父頁(yè)面來(lái)進(jìn)行判斷,使用的Array并不等于子頁(yè)面的Array;
三、toString()方法
該方法原理
console.log(Object.prototype.toString.call(arr) === '[object Array]'); //true console.log(Object.prototype.toString.call(json) === '[object Array]'); //false四、數(shù)組僅有的方法
console.log(arr.sort === Array.prototype.sort); //trueconsole.log(json.sort === Array.prototype.sort); //false五、Array.isArray()
Array.isArray(arr); // true Array.isArray(obj); //false總結(jié)
以上是生活随笔為你收集整理的判断一个变量类型是数组还是对象的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 不定高度的弹框 垂直水平居中
- 下一篇: vue单向数据流与双向绑定两者区别