网页特效 typeof数据类型检测函数
Javascript是一种弱类型脚本语言,弱类型并不代表没有类型。和其他的程序设计语言一样,Javascript中的数据也是有类型的,大的可以分为简单类型与复杂类型。
简单类型有 number,string,boolean
复杂类型有object和 function
下边的例子可以说明:
typeof 1 //echo "number"
typeof 1.1 //echo "number"
typeof "hello" //echo "string"
typeof true //echo "boolean"
typeof new Object() // echo "object"
typeof new Date() //echo "object"
typeof new Array() //echo "object"
typeof new Function() //echo "function"
typeof Object //echo "function"
typeof Date //echo "function"
typeof Array //echo "function"
typeof Function //echo "function"
上边的代码我们大致可以看出,使用typeof函数可以得出的Javascript数据类型有哪些,复杂类型只有object和function,而简单类型也只有三种。其实这并不准确,不论复杂类型还是简单类型,使用typeof得出的都不完全,下边我们将详细点描述。
对于简单类型,”number”可以分为integer和float两种,这两种类型在计算乘除的时候,是不一样的,这句有点废话,其实我想说的是,float类型在和int类型计算的时候,会有许多莫名奇妙的问题,就是因为float的精度问题。而对于复杂类型,就相对复杂些,javascript内置的一些类型从上边的例子我们可以看到,常见的有Date,Object,Array,Function(应该还有其他的吧,写这个的时候我想不起来),虽然他们使用typeof 计算时,返回的只有object换个function两种,但是他们其实是不一样的,如何不一样,就无需赘述。但是由上边的例子我们也可以看出,object和function两种类型比较特殊,我将他们其称之为基础类型。有个简单的区分方法,通常由new创建的都是object类型,通过function关键自定义的都是function类型,但是还有例外,就是new Function,它所创建的就是一个function,这个可能会在以后将函数的定义时提到吧。object类型,大致都能差不多理解,容易让人疑惑的是function类型,作为一种类型来描述时,其实应该描述为大写Function。Function本身的类型就是Function,由Function类型创建(包括使用function关键字定义)出来的function(函数)类型也是Function。这句话需要仔细理解。但是,还有一点,定义的function也是可以实例化的(这个词用这儿可能不太合适,不过便于理解),如下所示:
function functionType()
{
//echo I am a function
}
var func = new functionType();
我们分别再使用typeof来检查functionType和func的类型:
typeof functionType // echo "function"
typeof func // echo "object"
再揣摩上边的话,定义的function的类型也是Function,定义的function同样可以被用于实例化,就像系统内置的Date,Array等类型一样,这说明了自定义的function是可以被当做类型使用的,这就找到了一条自定义类型的路,在面向对象的语言中,我们称之为类。现在在Javascript,我们也有定义类方法,即定义function。同时,类也是对象,类对象的类型是Function。
以上可以看出,Javascript中的复杂类型其实由Date,Array,Object,Function,以及我们自定义的类(型)。
既然存在类型,我们就需要区分类型,我们上边说了,typeof不能准确区分,因此,我们引入另一个关键字instanceof,并不是函数,但是它会返回一个boolean类型的值,标明一个对象是否为另一个对象的实例。如下
typeof new Date() instanceof Date //echo true
typeof new Array() instanceof Array //echo true
typeof new Object() instanceof Object //echo true
function myType(){
// this is my type
}
var instance = new myType();
instance instanceof myType() //echo true
myType instanceof Function //echo true
new Date() instanceof myType() // echo false
我们可以看出,instanceof是用来检查一个对象是否为另一个对象的实例的。细心的朋友可能还会这样尝试:
Function instanceof Function //echo true
Function instanceof Object //echo true
Object instanceof Object //echo true
Object instanceof Function //true
老实说,这段代码很让人抓狂。我在前边也说过,Object和Function都为基础类型,我们前边也看到使用typeof时他们两个之间的关系,typeof Object结果为function,我个人认为,这说明了Javascript中所有复杂类型的基础的都是Function,换句话说所有的类型都是基于Function来实现的。另一方面任何对象使用instanceof Object结果都为true,说明了任何对象都是Object的实例。前边一句侧重于类型,后边侧重于实例(Function我们也可以认为它是自己的一个实例)。