JavaScript怎麼做類型判斷

JavaScript在對輸入或傳入參數時,經常需要使用到類型判斷,當不符合條件時做錯誤處理。那都有哪幾種方法做錯誤判斷呢?接下來,小迪總結下自己查找資料學到的。
常見的類型判斷應該有三種方法:
+ typeof
+ instanceof
+ prototype

接下來我會詳細介紹每一種用法如何使用,以及它們各自適用的場景。
1. typeof最簡單,對於FunctionStringNumberUndefined 等幾種類型的對象來說,他完全可以勝任,但是當你要判斷的對象爲Array時,typeof會返回Object。

var arr=new Array("1","2","3","4","5");
alert(typeof(arr)); // Object

2.JavaScript中instanceof運算符會返回一個 Boolean 值,指出對象是否是特定類的一個實例。 使用方法:(object) instanceof (class)

var arrayStr=new Array("1","2","3","4","5");
alert(arrayStr instanceof Array); //true

這種方法在多個iframe中就會出問題:

var iframe = document.createElement('iframe');    
document.body.appendChild(iframe);    
xArray = window.frames[window.frames.length-1].Array;       
var arr = new xArray("1","2","3","4","5");//這個寫法IE大哥下是不支持的,FF下才有

alert(arr instanceof Array); // false 
alert(arr.constructor === Array); // false  

3.prototype, javascript中每個對象都有一個原型屬性,我們可以利用原型屬性實現和java類似的繼承,今天我們會用它來做類型判斷。

在ECMA-262中如是寫到:

ECMA-262 寫道
Object.prototype.toString( ) When the toString method is called, the following steps are taken:
Get the [[Class]] property of this object.
Compute a string value by concatenating the three strings “[object “, Result (1), and “]”. Return Result (2)

上面的規範定義了Object.prototype.toString的行爲:首先,取得對象的一個內部屬性[[Class]],然後依據這個屬性,返回一個類似於”[object Array]”的字符串作爲結果(看過ECMA標準的應該都知道,[[]]用來表示語言內部用到的、外部不可直接訪問的屬性,稱爲“內部屬性”)。利用這個方法,再配合call,我們可以取得任何對象的內部屬性[[Class]],然後把類型檢測轉化爲字符串比較,以達到我們的目的。還是先來看看在ECMA標準中Array的描述吧。

你可以這樣使用prototype:

function isArray(obj) {   
  return Object.prototype.toString.call(obj) === '[object Array]';    
}  

call改變toString的this引用爲待檢測的對象,返回此對象的字符串表示,然後對比此字符串是否是’[object Array]’,以判斷其是否是Array的實例。也許你要問了,爲什麼不直接o.toString()?嗯,雖然Array繼承自Object,也會有toString方法,但是這個方法有可能會被改寫而達不到我們的要求,而Object.prototype則是老虎的屁股,很少有人敢去碰它的,所以能一定程度保證其“純潔性”。

那利用這種方法怎麼去判斷一個對象是不是JSON數組呢?
1. 可以通過兩步驗證的方法,先判斷是不是數組在判斷數組中每個對象是不是元素相同的JSON對象,想法很簡單,但實現起來就不簡單了。我簡單做了下,應該算完成功能,但絕對沒有正真實現。

//寫一個方法提取JSON數組裏的相同元素
vm.getArrayFromJSON = function(jsonArray, propertyName) {
    var returnArray = [];
    if (jsonArray instanceof Array) {
        for (var i = 0; i < jsonArray.length; i++) {
            if (jsonArray[i].propertyName != undefined) {
                returnArray.push(jsonArray[i].propertyName);
            }
        }
    } else {
        console.err("傳入的參數有誤!!");
    }
    return returnArray;
};

2.第二種方法,通過Jquery裏的方法做判斷吧,此方法暫時還在尋找中 >-<
可以用正則表達式:

 //判斷返回值不是 json 格式
 if (!data.match("^\{(.+:.+,*){1,}\}$")){
   //普通字符串處理
 }else{
   //通過這種方法可將字符串轉換爲對象
   data = eval("("+data+")");
 }

還想到一種方法:

if(data.toString().parse()){
}
//如果是JSON,json.parse()方法就不會報錯

又遇到一坑,你寫了一個json,當你再寫一個方法並且把,json某個屬性作爲參數傳遞進去的時候,如果你直接寫成function (json, jsonPropertyName)會報jsonPropertyName undefined的錯誤,如果你寫成 ‘jsonPropertyName’,你在函數具體代碼裏引用json.jsonPropertyName會出現它undefined的情況,這是一個json引用的問題,如果屬性名是字符串,需要使用json[propertyName]的形式使用。

vm.getArrayFromJSON = function(jsonArray, propertyName) {
    var returnArray = [];
    if (jsonArray instanceof Array) {
        for (var i = 0; i < jsonArray.length; i++) {
            if (jsonArray[i][propertyName] != undefined) {
                returnArray.push(jsonArray[i][propertyName]);
            }
        }
    } else {
        console.err("傳入的參數有誤!!");
    }
    return returnArray;
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章