ECMAScript 专题
专题目录
您的位置:ECMAScript > ECMAScript 专题 > ECMAScript 原始类型
ECMAScript 原始类型
作者:--    发布时间:2019-11-20

本节介绍了ecmascript的原始类型。

ecmascript有5种原始类型(primitive type),即undefined、null、boolean、number和string。

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之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。

例如,下面的代码将引发错误:

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。

boolean 类型

boolean类型是ecmascript中最常用的类型之一。它有两个值true和false (即两个boolean字面量)。

即使false不等于0,0也可以在必要时被转换成false,这样在boolean语句中使用两者都是安全的。

var bfound = true;
var blost = false;

number 类型

ecma-262中定义的最特殊的类型是number类型。这种类型既可以表示32位的整数,还可以表示64位的浮点数。

直接输入的(而不是从另一个变量访问的)任何数字都被看做number类型的字面量。例如,下面的代码声明了存放整数值的变量,它的值由字面量86定义:

var inum = 86;

八进制数和十六进制数

整数也可以被表示为八进制(以8为底)或十六进制(以16为底)的字面量。八进制字面量的首数字必须是0,其后的数字可以是任何八进制数字(0-7),如下面的代码所示:

var inum = 070;  //070 等于十进制的 56

要创建十六进制的字面量,首位数字必须为0,后面接字母x,然后是任意的十六进制数字(0到9和a到f)。这些字母可以是大写的,也可以是小写的。例如:

var inum = 0x1f;  //0x1f 等于十进制的 31
var inum = 0xab;  //0xab 等于十进制的 171

提示:尽管所有整数都可以表示为八进制或十六进制的字面量,但所有数学运算返回的都是十进制结果。

浮点数

要定义浮点值,必须包括小数点和小数点后的一位数字(例如,用1.0而不是1)。这被看作浮点数字面量。例如:

var fnum = 5.0;

对于浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串。

科学计数法

对于非常大或非常小的数,可以用科学计数法表示浮点数,可以把一个数表示为数字(包括十进制数字)加e(或 e),后面加乘以10的倍数。例如:

var fnum = 5.618e7

该符号表示的是数56180000。把科学计数法转化成计算式就可以得到该值:5.618 x 107

也可以用科学计数法表示非常小的数,例如0.00000000000000008可以表示为8e-17(这里,10被升到-17次冥,意味着需要被10除17次)。ecmascript默认把具有6个或6个以上前导0的浮点数转换成科学计数法。

提示:也可用64位ieee 754形式存储浮点值,这意味着十进制值最多可以有17个十进制位。17位之后的值将被裁去,从而造成一些小的数学误差。

特殊的 number 值

几个特殊值也被定义为number类型。前两个是number.max_value和number.min_value,它们定义了number值集合的外边界。所有ecmascript数都必须在这两个值之间。不过计算生成的数值结果可以不落在这两个值之间。

当计算生成的数大于 number.max_value 时,它将被赋予值number.positive_infinity,意味着不再有数字值。同样,生成的数值小于number.min_value 的计算也会被赋予值number.negative_infinity,也意味着不再有数字值。如果计算返回的是无穷大值,那么生成的结果不能再用于其他计算。

事实上,有专门的值表示无穷大,(如你猜到的)即infinity。number.positive_infinity的值为infinity。number.negative_infinity的值为-infinity。

由于无穷大数可以是正数也可以是负数,所以可用一个方法判断一个数是否是有穷的(而不是单独测试每个无穷数)。可以对任何数调用isfinite()方法,以确保该数不是无穷大。例如:

var iresult = inum * some_really_large_number;

if (isfinite(iresult))
 {
    alert("finite");
}

else {
    alert("infinite");
}

最后一个特殊值是nan,表示非数(not a number)。nan是个奇怪的特殊值。一般说来,这种情况发生在类型(string、boolean 等)转换失败时。例如,要把单词 blue转换成数值就会失败,因为没有与之等价的数值。与无穷大一样,nan也不能用于算术计算。nan的另一个奇特之处在于,它与自身不相等,这意味着下面的代码将返回false:

alert(nan == nan);  //输出 "false"

出于这个原因,不推荐使用nan值本身。函数isnan()会做得相当好:

alert(isnan("blue"));  //输出 "true"
alert(isnan("666"));  //输出 "false"

string 类型

string类型的独特之处在于,它是唯一没有固定大小的原始类型。可以用字符串存储0或更多的unicode字符,有16位整数表示(unicode是一种国际字符集,在本教程的后续章节将讨论它)。

字符串中每个字符都有特定的位置,首字符从位置0开始,第二个字符在位置1,依此类推。这意味着字符串中的最后一个字符的位置一定是字符串的长度减1:

字符串的长度和字符的位置

字符串字面量是由双引号(")或单引号(')声明的。而java则是用双引号声明字符串,用单引号声明字符。但是由于ecmascript没有字符类型,所以可使用这两种表示法中的任何一种。例如,下面的两行代码都有效:

var scolor1 = "red";
var scolor2 = 'red';

string类型还包括几种字符字面量,java、c和perl的开发者应该对此非常熟悉。

下面列出了ecmascript的字符字面量:

字面量含义
\n换行
\t制表符
空格
\r回车
\f换页符
\\反斜杠
\'单引号
\"双引号
\0nnn八进制代码nnn表示的字符(n是0到7中的一个八进制数字)
\xnn十六进制代码nn表示的字符(n是0到f中的一个十六进制数字)
\unnnn十六进制代码nnnn表示的unicode字符(n是0到f中的一个十六进制数字)
网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册