一、typeof 操作符
对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时
var arr=new Array("","","","","");
typeof arr //object
二、instanceof
JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。
var arrayStr=new Array("","","","","");
arrayStr instanceof Array//true
三、Object.prototype.toString( )
ECMA-262 :Object.prototype.toString( ) When the toString method is called, the following steps are taken:
1.Get the [[Class]] property of this object.
2.Compute a string value by concatenating the three strings “[object “, Result (1), and “]”.
3.Return Result (2)
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
call改变toString的this引用为待检测的对象,返回此对象的字符串表示,然后对比此字符串是否是'[object Array]',以判断其是否是Array的实例。也许你要问了,为什么不直接o.toString()?嗯,虽然Array继承自Object,也会有toString方法,但是这个方法有可能会被改写而达不到我们的要求,而Object.prototype则很少有人敢去碰它,所以能一定程度保证其“纯洁性”。
这里我们调用了 Object 对象原型的 toString 方法,如果对象是数组,则该函数返回’[object Array]‘。这种方法也可以用来获得任何其他变量的类型,不管变量的实际类型是什么,返回值都是以 object 开头,因为 Nunmber,String,Boolean,Array,Function 都继承自 JavaScript 内置的 Object 对象,而每一个变量,都是与其类型相应的对象的一个实例。
var num = ;
alert(Object.prototype.toString.call(num)); // [object Number]
var str = 'hudidit.com';
alert(Object.prototype.toString.call(str)); // [object String]
var boo = true;
alert(Object.prototype.toString.call(boo)); // [object Boolean]
var fun = function(){};
alert(Object.prototype.toString.call(fun)); // [object Function]
var obj = {};
alert(Object.prototype.toString.call(obj)); // [object Object]
var arr = [];
alert(Object.prototype.toString.call(arr)); // [object Array]
四、jQuery.isArray([]),源码如下:
isArray: Array.isArray || function( obj ) {
return jQuery.type(obj) === "array";
}
//jQuery.type源码
var class2type = {};
var toString = class2type.toString;
jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});
type: function( obj ) {
if ( obj == null ) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ?
class2type[ toString.call(obj) ] || "object" :
typeof obj;
}
{
"[object Array]" : "array",
"[object Boolean]" : "boolean",
"[object Date]" : "date",
"[object Error]" : "error",
"[object Function]" : "function",
"[object Number]" : "number",
"[object Object]" : "object",
"[object RegExp]" : "regexp",
"[object String]" : "string"
}
toString方法的返回值正好是class2type对象的key值。所以class2type[ toString.call(obj) ]正好得到我们需要的返回类型字符串。
isFunction: function( obj ) {
return jQuery.type(obj) === "function";
}