JavaScript判断变量类型:typeof函数与constructor属性异同
2008-07-21 15:57
656 查看
有时你可能需要对变量进行类型检查,或者判断变量是否已定义。有两种方法可以使用:typeof函数与constructor属性。
typeof函数的用法可能不用我多说,大家都知道怎么用。而constructor属性大家可能就陌生点。在《精通JavaScript》这本书中有提到construct的用法,但我用自己的几个浏览器(IE7.0 / Firefox1.9 / Opera9.50)测试的结果却和书上说的不一样。但是仍然是有办法通过constructor属性来检查变量类型的。
这里先补充一下,为什么明明有typeof函数可以很方便地用来检测类型,还要用constructor呢?
因为typeof会把所有的数组类型以及用户自定义类型判断为object,从而无法知道更确切的信息。而constructor却可以解决这个问题。
ok,明白了我们为什么要用constructor,现在让我带大家一步步认识一下typeof和constructor用法之间的差异吧~
首先我们运行一下下面这段代码:
1 var i;
2 alert(typeof(i));
3 alert(i.constructor);
这3行代码告诉你什么情况下可以用constructor。
你可以看到第2行返回了字符串'undefined',而第三行则发生了错误,原因是i变量还没有类型定义,自然也没有constructor的存在。
从这一点上看,typeof可以检查到变量是否有定义,而construct只能检查已定义变量的类型。
再运行一下下面这段代码:
1 var i = 2;
2 alert(typeof(i));
3 alert(i.constructor);
4 alert(typeof(i.constructor));
你会看到第2行返回了字符串'number’,第3行返回了一串类似函数定义的代码字符串(这就是跟《精通JavaScript》一书中介绍的不一样的地方)。
我们再用typeof检查一下constructor到底是个什么样类型的属性,第4行返回结果'function',也就是说,实际上constructor是一个函数,更确切地说是一个构造函数。这时你就可以知道,为什么constructor可以检查出各种类型了。
有经验的程序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种,这里提供一种比较容易理解的方法。
其实想法很简单,就是把construcor转化为字符串,通过寻找匹配字符串(function名)来确定是否指定类型。如下例子:
1 function user() {};
2 var i = new user();
3 alert((i.constructor+'').match(/user/) == null);
这仅仅是个简单的例子。如果返回true则变量i不是user类型,返回false则变量是user类型。
当然,这样检测是不够精确的,比如其实他是一个myuser类型的时候,同样会被认为是user类。所以你需要书写更精确的正则表达式去进行匹配。
可以这样简单改进你的正则表达式:
/function user\(\)/
替换上面代码段中的/user/。当然,如果你的构造函数原型是user(a),那么应该这样书写你的正则表达式:
/function user\(a\)/
到这里你应该知道怎样使用constructor类型去检查变量类型了吧?
ok,最后再提个醒,如果你要用基于constructor的方法去检查一些基本类型,如
Object / Array / Function / String / Number / Boolean
在你的正则表达式中,一定要将这些单词的首字母大写!!而如果该类型是自定义类型,则根据你定义的时候标识符的写法确定。
typeof函数的用法可能不用我多说,大家都知道怎么用。而constructor属性大家可能就陌生点。在《精通JavaScript》这本书中有提到construct的用法,但我用自己的几个浏览器(IE7.0 / Firefox1.9 / Opera9.50)测试的结果却和书上说的不一样。但是仍然是有办法通过constructor属性来检查变量类型的。
这里先补充一下,为什么明明有typeof函数可以很方便地用来检测类型,还要用constructor呢?
因为typeof会把所有的数组类型以及用户自定义类型判断为object,从而无法知道更确切的信息。而constructor却可以解决这个问题。
ok,明白了我们为什么要用constructor,现在让我带大家一步步认识一下typeof和constructor用法之间的差异吧~
首先我们运行一下下面这段代码:
1 var i;
2 alert(typeof(i));
3 alert(i.constructor);
这3行代码告诉你什么情况下可以用constructor。
你可以看到第2行返回了字符串'undefined',而第三行则发生了错误,原因是i变量还没有类型定义,自然也没有constructor的存在。
从这一点上看,typeof可以检查到变量是否有定义,而construct只能检查已定义变量的类型。
再运行一下下面这段代码:
1 var i = 2;
2 alert(typeof(i));
3 alert(i.constructor);
4 alert(typeof(i.constructor));
你会看到第2行返回了字符串'number’,第3行返回了一串类似函数定义的代码字符串(这就是跟《精通JavaScript》一书中介绍的不一样的地方)。
我们再用typeof检查一下constructor到底是个什么样类型的属性,第4行返回结果'function',也就是说,实际上constructor是一个函数,更确切地说是一个构造函数。这时你就可以知道,为什么constructor可以检查出各种类型了。
有经验的程序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种,这里提供一种比较容易理解的方法。
其实想法很简单,就是把construcor转化为字符串,通过寻找匹配字符串(function名)来确定是否指定类型。如下例子:
1 function user() {};
2 var i = new user();
3 alert((i.constructor+'').match(/user/) == null);
这仅仅是个简单的例子。如果返回true则变量i不是user类型,返回false则变量是user类型。
当然,这样检测是不够精确的,比如其实他是一个myuser类型的时候,同样会被认为是user类。所以你需要书写更精确的正则表达式去进行匹配。
可以这样简单改进你的正则表达式:
/function user\(\)/
替换上面代码段中的/user/。当然,如果你的构造函数原型是user(a),那么应该这样书写你的正则表达式:
/function user\(a\)/
到这里你应该知道怎样使用constructor类型去检查变量类型了吧?
ok,最后再提个醒,如果你要用基于constructor的方法去检查一些基本类型,如
Object / Array / Function / String / Number / Boolean
在你的正则表达式中,一定要将这些单词的首字母大写!!而如果该类型是自定义类型,则根据你定义的时候标识符的写法确定。
相关文章推荐
- JavaScript判断变量类型:typeof函数与constructor属性异同
- JavaScript判断变量类型:typeof函数与constructor属性异同
- JavaScript判断变量类型:typeof函数与constructor属性异同
- JavaScript判断变量类型:typeof函数与constructor属性异同
- JavaScript判断变量类型:typeof函数与constructor属性异同
- JavaScript判断变量类型:typeof函数与constructor属性异同
- JavaScript类型检测, typeof操作符与constructor属性的异同
- js中判断数据类型的属性typeof、instanceof、 constructor、 prototype
- javascript判断变量类型的自定义函数
- js中判断变量类型函数typeof的用法总结
- [JS]js中判断变量类型函数typeof的用法汇总
- JavaScript中判断变量是数组、函数或是对象类型的方法
- JavaScript基于自定义函数判断变量类型的实现方法
- js中判断变量类型函数typeof的用法总结
- javascript判断变量类型的自定义函数
- JavaScript中类型判断:typeof、constructor、Object.propotype.toString.call()的比较
- javascript数据变量类型判断(JS变量是否是数组,是否是函数的判断)
- JavaScript中判断变量是数组、函数或是对象类型的方法
- typeof函数与constructor属性异同
- JavaScript中如何判断变量是数组、函数或是对象类型