本文也同步发表在我的公众号“我的天空”
首先我们先思考一下,执行下列语句分别会显示什么?
alert(typeof(Array));
alert(typeof(Array()));
我们进入正题!
在JS中任何变量都是有其数据类型的,而通过typeof()我们可以获得该变量的具体类型,我们看以下这段代码:
var a=1;
var b=false;
alert(typeof(a)); //弹出number
alert(typeof(b)); //弹出boolean
我们把变量a赋值为1,那么其数据类型为number,所以返回结果就是number,而b赋值为false,其数据类型为boolean,因此返回结果就是boolean。以上是基本数据类型的,很好理解。接下来我们来看更复杂的引用类型,而在引用类型里,尤其以function类型更令人迷惑。
我们都知道function是函数,但是很容易被忽略的是在JS中,function也是一种数据类型,而其函数名实质上也是一个变量,我们看以下这段代码:
function hello(){
return "hi";
}
我们声明了一个hello函数,但是从另一个角度来说,我们其实是声明了一个名称为hello的变量,其类型为function,所以我们想获得hello这个变量的类型时,要执行typeof(hello),注意这个地方是hello而不是hello(),其返回的结果自然就是function。
这个地方,很容易会混淆误写为typeof(hello()),如果写成这样的话,那实际上返回的是执行hello()函数后其返回结果的数据类型,而hello()返回的是一个字符串,所以typeof(hello())的结果就是string。其实typeof(hello())是两句代码的连写,其相当于以下代码,很显然,a自然是string类型的。
var a=hello();
alert(typeof(a)); //弹出string
如果我们要获得的是一个未声明变量的类型,那将返回undefined,例如我们直接运行typeof(test),由于我们并未声明test这个变量(无论是基本类型还是引用类型),因此其自然返回undefined。
要注意的时,对于js的全局变量或全局函数,我们是无需声明就可以直接使用的,那么对于这些变量和函数,是可以直接获取其数据类型的,而这个地方非常容易被混淆。我们看以下的数组声明代码:
var a=new Array()
alert(typeof(a)); //弹出object
这段代码也很好理解,我们声明了一个变量a,并把它初始化为一个数组,由于数组是object类型的,那么自然a的类型就是object。
接下来看最有意思的一点,仔细分析var a=new Array(),其实我们是通过构造函数来声明这个数组对象的,其中的Array()就是构造函数,既然是构造函数,那么其自然就是函数了,那么其和以下的这种形式就像类似了(当然以下是伪代码):
function Array(){
return ....
}
那么这个就和我们之前声明的hello()函数的结构是一样的,只是Array()是 JS全局函数,无需声明就可以直接使用。因此,我们自然也可以无需声明就来检测Array的数据类型,其结果就是function了。
alert(typeof(Array)); //弹出function
而当我们执行typeof(Array())时,由于Array()的运行结果是返回一个数组,而数组是Object的,因此其会返回Object。
alert(typeof(Array())); //弹出Object
因此,请一定要搞清楚下面这些typeof()具体都是要返回什么东西的类型:
var a=new Array();
alert(typeof(a)); //弹出Object
alert(typeof(Array)); //弹出function
alert(typeof(Array())); //弹出Object
其实类似的,我们还可以考虑typeof(Object)和typeof(Object())分别返回什么。