JavaScript判断变量类型:typeof函数与constructor属性异同

有时你可能须要对变量进行类型检查,或者判断变量是否已定义。有两种方法可使用:typeof函数与constructor属性。程序员

typeof函数的用法可能不用我多说,你们都知道怎么用。而constructor属性你们可能就陌生点。在《精通JavaScript》这本书中有提到construct的用法,但我用本身的几个浏览器(IE7.0 / Firefox1.9 / Opera9.50)测试的结果却和书上说的不同。可是仍然是有办法经过constructor属性来检查变量类型的。正则表达式

这里先补充一下,为何明明有typeof函数能够很方便地用来检测类型,还要用constructor呢?数组

由于typeof会把全部的数组类型以及用户自定义类型判断为object,从而没法知道更确切的信息。而constructor却能够解决这个问题。浏览器

ok,明白了咱们为何要用constructor,如今让我带你们一步步认识一下typeof和constructor用法之间的差别吧~函数

首先咱们运行一下下面这段代码:测试

var i;
alert(typeof(i));
alert(i.constructor);

这3行代码告诉你什么状况下能够用constructor。code

你能够看到第2行返回了字符串'undefined',而第三行则发生了错误,缘由是i变量尚未类型定义,天然也没有constructor的存在。ip

从这一点上看,typeof能够检查到变量是否有定义,而construct只能检查已定义变量的类型。字符串

再运行一下下面这段代码:原型

var i = 2;
alert(typeof(i));
alert(i.constructor);
alert(typeof(i.constructor));

你会看到第2行返回了字符串'number’,第3行返回了一串相似函数定义的代码字符串(这就是跟《精通JavaScript》一书中介绍的不同的地方)。

咱们再用typeof检查一下constructor究竟是个什么样类型的属性,第4行返回结果'function',也就是说,实际上constructor是一个函数,更确切地说是一个构造函数。这时你就能够知道,为何constructor能够检查出各类类型了。

有经验的程序员看到这里应该知道要怎么利用constructor来检查变量类型了。方法有多种,这里提供一种比较容易理解的方法。

其实想法很简单,就是把construcor转化为字符串,经过寻找匹配字符串(function名)来肯定是否指定类型。以下例子:

function user() {};
var i = new user();
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

在你的正则表达式中,必定要将这些单词的首字母大写!!而若是该类型是自定义类型,则根据你定义的时候标识符的写法肯定。

相关文章
相关标签/搜索