数据类型 – 学习画板

首页 » JavaScript » 数据类型

数据类型

typeof

鉴于ECMAScript是松散类型的,因此需要有一种手段来检测给定变量的数据类型——typeof就是负责提供这方面信息的操作符。对一个值使用typeof操作符可能返回下列某个字符串:

  • “undefined”——如果这个值未定义
  • “boolean”——如果这个值是布尔值
  • “string”——如果这个值是字符串
  • “number”——如果这个值是数值
  • “object”——如果这个是对象或null
  • “function”——如果这个值是函数

下面是几个使用typeof操作符的例子:

var message = "some string";
alert(typeof message);   //"string"
alert(typeof(message));  //"string"
alert(typeof 95);        //"number"

这几个例子说明,typeof操作符的操作数可以是变量(message),也可以是数值字面量。注意,typeof是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必须的。

有些时候,typeof操作符会返回一些令人迷惑但技术上却正确的值。比如,调用typeof  null会返回”object”,因为特殊值null被认为是一个空的对象引用。Safari 5之前的版本、Chrome 7及之前版本在对正则表达式调用typeof操作符时会返回”function”,而其它浏览器在这种情况下会返回”object”。

从技术角度讲,函数在ECMAScript中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其它对象是有必要的。

Undefined

Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined,例如:

var message;
alert(message == undefined); //true

这个例子只声明了变量message,但未对其进行初始化。比较这个变量与undefined字面量,结果表明它们是相等的。这个例子与下面的例子是等价的:

var message = undefined;
alert(message == undefined); //true

这个例子使用undefined值显式初始化了变量message。但我们没有必要这么做,因为未经初始化的值默认就会取得undefined值。

一般而言,不存在需要显式地把一个变量设置为undefined值的情况。字面值undefined的主要目的是用于比较。

不过,包含undefined值的变量与尚未定义的变量还是不一样的。看看下面的例子:

var message;     //这个变量声明之后默认取得了undefined值
alert(message);  //“undefined”
alert(age);      //发生错误

运行上面的代码,第一个警告框会显示变量message的值,即“undefined”。而第二个警告框——由于传递给alert()函数的是尚未声明变量age——则导致一个错误。对于尚未声明过的变量,只能执行一项操作,即使用typeof操作符检测其数据类型。

然而,对于未初始化的变量执行typeof操作符会返回undefined值,而对未声明的变量执行typeof操作符同样也会返回undefined值。来看下面的例子:

var message;
alert(typeof message);  //“undefined”
alert(typeof age);      //“undefined”

结果表明,对未初始化和未声明的变量执行typeof操作符都返回了undefined值;这个结果有其逻辑上的合理性。因为虽然这两种变量从技术上角度看有本质区别,但实际上无论对那种变量也不可能执行真正的操作。

即便未初始化的变量会自动赋予undefined值,但我们任然建议读者养成显式初始化变量依然是明智的选择。如果能够做到这一点,那么当typeof操作符返回”undefined”值时,我们就知道被检测的变量是有还是没有被声明的,而不是尚未初始化的。

Null

Null类型是第二个只有一个值的数据类型,这个特殊的值是null。从逻辑角度来看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null值时会返回“object”的原因,如下面的例子所示:

var call = null;
alert(typeof car);  //"object"

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其它值。这样以来,只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用了,如下面的例子所示:

if (car !=null) {
    //对car对象执行某些操作
}

实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true:

alert(null == undefined); //true

这里,位于null和undefined之间相等操作符(==)总是返回true,不过要注意的是,这个操作符处于比较的目的会转换其操作数。

尽管null和undefined有这样的关系,但它们的用途完全不同。无论在什么情况下都没有必要把一个变量的值显式的设置为undefined,可是同样的规则对null却不适用。换句话说,只要意在保存对象的变量还没有真正保存对象,就应该明确保存null值。这样不仅可以体现null作为空对象指针的管理,而且也有助于进一步区分null和undefined。

此文章发表在 JavaScript. 将 固定链接 加入收藏.