判斷一個數據是不是數組,在以往的實現中,能夠基於鴨子類型的概念來判斷,好比判斷這個數據有沒有length 屬性,有沒有sort方法或者slice 方法等。但更好的方式是用Object.prototype.toString來計算。數組
Object.prototype.toString.call(obj)返回一個字符串,好比Object.prototype.toString.call([1,2,3])老是返回"[objectArray]",而Object.prototype.toString.call(「str」)老是返回"[objectString]"。因此咱們能夠編寫一系列的isType 函數。代碼以下:函數
var isString = function( obj ){ return Object.prototype.toString.call( obj ) === '[object String]'; }; var isArray = function( obj ){ return Object.prototype.toString.call( obj ) === '[object Array]'; }; var isNumber = function( obj ){ return Object.prototype.toString.call( obj ) === '[object Number]'; };
var isType = function( type ){ return function( obj ){ return Object.prototype.toString.call( obj ) === '[object '+ type +']'; } }; var isString = isType( 'String' ); var isArray = isType( 'Array' ); var isNumber = isType( 'Number' ); console.log( isArray( [ 1, 2, 3 ] ) ); // 輸出:true
咱們還能夠用循環語句,來批量註冊這些isType 函數:prototype
var Type = {}; for ( var i = 0, type; type = [ 'String', 'Array', 'Number'][ i++ ]; ){ (function( type ){ Type[ 'is' + type ] = function( obj ){ return Object.prototype.toString.call( obj )==='[object '+ type +']'; } })( type ) }; Type.isArray( [] ); // 輸出:true Type.isString( "str" ); // 輸出:true