javascript 变量类型判断
一、typeof 操作符
对于Function, String, Number ,Undefined 等几种类型的对象来说,他完全可以胜任,但是为Array时
var arr=new Array("1","2","3","4","5"); typeof arr //object
二、instanceof
JavaScript中instanceof运算符会返回一个 Boolean 值,指出对象是否是特定类的一个实例。
var arrayStr=new Array("1","2","3","4","5"); 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 = 1; 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"; }