判断一个数据是否是数组,在以往的实现中,可以基于鸭子类型的概念来判断,比如判断这个数据有没有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 函数:
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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。