之前strong去見(jiàn)了大神回來(lái)問(wèn)我,怎么判斷一個(gè)變量是數(shù)組,至少要用三種方法。
參見(jiàn)一篇來(lái)自前端大全的文章
參考鏈接在這里
isArray()
照理說(shuō)這個(gè)方法是最簡(jiǎn)便的方法。
if(Array.isArray(value)){}
但是這個(gè)方法在IE9以下的瀏覽器并不支持
typeof()
數(shù)組是特殊的對(duì)象,所以數(shù)組的typeof結(jié)果是object。然而,null的typeof結(jié)果也是object。所以要用typeof的話就得寫(xiě)成
var a = [1,2,3];
//是object且要排除null和純對(duì)象
console.log(
(typeof a === 'object' && a !== null && Object.prototype.toString.call(a) !== '[object Object]')); //true
instanceof()
對(duì)于一個(gè)網(wǎng)頁(yè)或者一個(gè)全局作用域而言。這個(gè)方法是有效的
if(a instanceof Array){//...}
但是如果這個(gè)頁(yè)面嵌套了frame暫且叫做a.html。
這個(gè)frame里定義了window.a= [1,3,5];
那么
window.onload = function(){
var a = window.frames[0].a;
console.log(a instanceof Array); //false
console.log(a.constructor === Array); //false
}
這是因?yàn)槊總€(gè) frame 都有一套自己的執(zhí)行環(huán)境,跨 frame 實(shí)例化的對(duì)象彼此不共享原型鏈。如果打印 a instanceof window.frames[0].Array,那么結(jié)果就是 true 了。
特性嗅探
var b = [3,4,5];
if(b.sort){//.....}
這樣一旦某個(gè)對(duì)象正好有值為sort的key的話,就會(huì)有問(wèn)題。
比如:
var b = {sort:'aaa'};
這樣的話b.sort也是true,所以也不能用。
最靠譜的方法應(yīng)該是
Object.prototype.toString.call(value)
這個(gè)方法的原理是:
每個(gè)對(duì)象有一個(gè)叫做class的內(nèi)部屬性,再配合 call,我們可以取得任何對(duì)象的內(nèi)部屬性 [[Class]],然后把類(lèi)型檢測(cè)轉(zhuǎn)化為字符串輸出。