JavaScript 使用 toString
■知識點
在對象上調(diào)用Object的原型方法toString(),就會返回統(tǒng)一格式的字符串表示。例如:
var _toString = Object .prototype. toString; //引用Object 的原型方法 toString ()
//使用apply方法在對象上動態(tài)調(diào)用Object的原型方法toString ()
console. log ( _toString.apply ( o )); //表示為"[object Object]"
console. log ( _toString.apply ( a )); //表示為"[object Array]"
console. log ( _toString.apply ( f )); //表示為"[object Function]"
仔細分析不同類型對象的toString()方法返回值,會發(fā)現(xiàn)由Object的原型方法toString()直接返回的字 符串的格式如下:
[object Class]
其中,object表示對象的基本類型,Class表示對象的子類型,子類型的名稱與該對象的構(gòu)造函數(shù)名一一對應(yīng)。例如,Object 對象的Class 為 Object, Array 對象的 Class 為 Array,F(xiàn)unction 對象的 Class 為 Function, Date 對象的 Class 為 Date,Math 對象的 Class 為 Math,Error 對象(包括 Error 子類)的 Class 為Error等。
宿主對象也有預(yù)定的Class值,如Window、Document和Form等。用戶自定義的對象的Class為 Object。用戶自定義的類型,可以根據(jù)這個格式自定義類型表示。
Class值提供的信息與constructor屬性值都能夠檢測數(shù)據(jù)類型,但是Class值是以字符串的形式提供這些信息,這在開發(fā)環(huán)境中是非常有用的。而使用typeof運算符進行類型檢測,由于其返回的字符串表示比較有限,無法準(zhǔn)確分辨Object、Function和Army等類型。
■實例設(shè)計
設(shè)計typeOfO方法,利用其返回的數(shù)據(jù)類型的字符串表示,可以設(shè)計一種更安全、更強健的類型檢測方法。
function typeOf(obj){
var str = Object.prototype.toString.call(obj);
return str.match(/\[object (.*?)\]/) [1].toLowerCase();
};
console.log( typeOf({}) ) ; //"object"
console.log( typeOf([]) ); //"array"
console.log( typeOf(0) ); //"number"
console.log( typeOf(null)); //"null"
console.log( typeOf(undefined)); //"undefined"
console.log( typeOf(/ /)); //"regex"
console.log( typeOf(new Date()));//"date"
在上面檢測的函數(shù)中,模擬typeof運算符的返回值格式,設(shè)計所有類型返回的字符串表示都以小寫 的單個詞來表示。
在typeOfO方法的基礎(chǔ)上擴展方法,專門檢測某種類型數(shù)據(jù)。
['Null','Undefined', 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function', 'RegExp'].forEach(function (t) {
typeOf['is' + t] = function (o) {
return typeOf(o) === t.toLowerCase ();
};
});
console.log( typeOf.isObject({}) ); //true
console.log( typeOf.isNumber(NaN) ); //true
console.log( typeOf.isRegExp(true) ); //false
點擊加載更多評論>>