ECMAScript有5种原始类型(primitive type),即Undefined、Null、Boolean、Number和String。
typeof运算符
typeof运算符有一个参数,可以用于检测变量的类型。例如:
var sTemp = "test string";
alert (typeof sTemp); //输出 "string"
alert (typeof 86); //输出 "number"
对变量或值调用typeof运算符将返回下列值之一:
- undefined - 如果变量是Undefined类型的
- boolean - 如果变量是Boolean类型的
- number - 如果变量是Number类型的
- string - 如果变量是String类型的
- object - 如果变量是一种引用类型或Null类型的
注释:您也许会问,为什么typeof运算符对于null值会返回"Object"。这实际上是JavaScript最初实现中的一个错误,然后被ECMAScript沿用了。现在,null被认为是对象的占位符,从而解释了这一矛盾,但从技术上来说,它仍然是原始值。
Undefined 类型
如前所述,Undefined类型具有唯一的值,即undefined。当声明的变量未初始化时,该变量的默认值是undefined。
var oTemp;
前面一行代码声明变量oTemp,没有初始值。该变量将被赋予值undefined,即undefined类型的字面量。可以用下面的代码段测试该变量的值是否等于undefined:
var oTemp;
alert(oTemp == undefined);
这段代码将显示"true",说明这两个值确实相等。还可以用typeof运算符显示该变量的值是undefined:
var oTemp;
alert(typeof oTemp); //输出 "undefined"
提示:值undefined并不同于未定义的值。但是,typeof运算符并不真正区分这两种值。考虑下面的代码:
var oTemp;
alert(typeof oTemp); //输出 "undefined"
alert(typeof oTemp2); //输出 "undefined"
前面的代码对两个变量输出的都是"undefined",即使只有变量oTemp2从未被声明过。如果对oTemp2使用除typeof之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上,因为在没有let
之前,typeof
运算符是百分之百安全的,但如果未声明的参数在后期被let使用就会报错,let不存在变量提升
例如,下面的代码将引发错误:
var oTemp;
alert(oTemp2 == undefined);
当函数无明确返回值时,返回的也是值"undefined",如下所示:
function testFunc() {
}
alert(testFunc() == undefined); //输出 "true"
Null 类型
另一种只有一个值的类型是Null,它有唯一专用值null,即它的字面量。值undefined实际上是从值null派生来的,因此ECMAScript把它们定义为相等的。
alert(null == undefined); //输出 "true"
尽管这两个值相等,但它们的含义不同。undefined是声明了变量但未对其初始化时赋予该变量的值,null则用于表示尚未存在的对象(在讨论typeof运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是null。