判斷一個對象是否是數組


1、從原型入手,Array.prototype.isPrototypeOf(obj);

利用isPrototypeOf()方法,判定Array是不是在obj的原型鏈中,如果是,則返回true,否則false。

 

2、也可以從構造函數入手,obj instanceof Array

先說說 typeof 和 instanceof 的區別?

兩者都可以用來判斷變量,typeof會返回基本類型,如文章開頭,我們很簡單可以用

typeof a != 'undefined' 判斷a變量存在。而instanceof只會返回一個布爾值,那么我們試試,結果如下:

上面的方法其實也可以用對象constructor屬性,因為在js中每個對象都有constructor屬性,這種也常用作判斷未知對象的類型。

 例如:typeof arr == "object" && arr.constructor == Array; //先判斷是對象再進一步判斷。

那樣是不是這個方法就ok了?別開心那么早,坑總是會有的。

在一些跨框架的頁面中的數組,使用該方法可能不會那么順利,原因是在不同的框架中創建的數組不會相互共享其prototype屬性。

問題總是要解決的,有沒有更加精確的方法呢?==果真有啊!

 

3、根據對象的class屬性(類屬性),跨原型鏈調用toString()方法。

解釋一下,在js中一個對象一旦被創建,在內部會攜帶創建對象的類型名,一旦創建就不能被修改了。那么怎么獲取這個對象的類型名呢?

js中提供了,調用對象原型中的toString方法, Object.prototype.toString.call(obj);因為很多對象繼承的toString()方法被重寫了,為了能夠調用正確的toString()版本,也就是最原始的版本。可以使用Function.call()的方法,其中call可以這么理解,相當於obj去借用這個 Object.prototype.toString();

1
2
3
Object.prototype.toString.call( new  Date());    //"[object Date]"
Object.prototype.toString.call(Window);        //"[object window]"
Object.prototype.toString.call(/./);           //"[object RegExp]"

那么有了這個方法,獲取對象名可以這樣獲取:

或者這么寫:

function _getClass(o){
    if(o===null) return "Null";
    if(o===undfined) return "undefined";
    return Object.prototype.toString.call(o).slice(8,-1);
}

 

4、Array.isArray()方法。

其實js已經提供了判斷是不是數組類型的方法,如下:

1
2
3
4
Array.isArray([1, 2, 3]);   // true
Array.isArray({foo: 123});  // false
Array.isArray( 'foobar' );    // false
Array.isArray(undefined);   // false  

在MDN中就比較了isArray和instanceof的區別,當Array.isArray()不可用的使用,MDN做了如下的補丁,說明還是比較推薦使用前面講的第三種方法 Object.prototype.toString.call(obj)。

 

摘自:https://www.cnblogs.com/leaf930814/p/6659996.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM