javascript 变量类型判断
2016-03-17 15:26
435 查看
一、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)
上面的规范定义了Object.prototype.toString的行为:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于"[object Array]"的字符串作为结果。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。
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; }
所以当传入的是字符串,数字,undefined的时直接返回 typeof obj。当传入的是对象、数组、函数时则直接返回 ( class2type[ toString.call(obj) ] || "object" )。
jQuery定义了class2type的一个对象,并将其初始化为如下的格式:
{ "[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"; }
相关文章推荐
- javaScript开发视屏课程(将获取元素封装成方法)
- js快速求数组之和
- JavaScript Cookies
- JavaScript Window - 浏览器对象模型
- JavaScript的对象深度克隆方法
- swiper 单slide轮播
- javascript权威指南学习笔记3
- js 增加控件
- chart.js图表 传值问题
- js读取解析JSON类型数据
- js调用百度地图API创建地图
- JavaScript Array(数组) 对象
- JS原生追加子节点
- 处理滚动条置底的JS代码
- json数据传输有感
- 跨域数据操作jsonp
- JSONKit EXC_BAD_ACCESS
- JavaScript 字符串(String) 对象
- JSP中的EL表达式详细介绍
- JS中for循环变量作用域