# ECMAScript 原始类型
**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 之外的其他运算符的话,会引起错误,因为其他运算符只能用于已声明的变量上。
例如,下面的代码将引发错误:
```
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 10<sup>7</sup>。
也可以用科学计数法表示非常小的数,例如 0.00000000000000008 可以表示为 8-e<sup>17</sup>(这里,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:
![字符串的长度和字符的位置](https://box.kancloud.cn/2015-12-13_566d1579733cc.gif)
字符串字面量是由双引号(")或单引号(')声明的。而 Java 则是用双引号声明字符串,用单引号声明字符。但是由于 ECMAScript 没有字符类型,所以可使用这两种表示法中的任何一种。例如,下面的两行代码都有效:
```
var sColor1 = "red";
var sColor2 = 'red';
```
String 类型还包括几种字符字面量,Java、C 和 Perl 的开发者应该对此非常熟悉。
下面列出了 ECMAScript 的字符字面量:
| 字面量 | 含义 |
| --- | --- |
| \n | 换行 |
| \t | 制表符 |
| \b | 空格 |
| \r | 回车 |
| \f | 换页符 |
| \\ | 反斜杠 |
| \' | 单引号 |
| \" | 双引号 |
| \0_nnn_ | 八进制代码 _nnn_ 表示的字符(_n_ 是 0 到 7 中的一个八进制数字) |
| \x_nn_ | 十六进制代码 _nn_ 表示的字符(_n_ 是 0 到 F 中的一个十六进制数字) |
| \u_nnnn_ | 十六进制代码 _nnnn_ 表示的 Unicode 字符(_n_ 是 0 到 F 中的一个十六进制数字) |
- JavaScript 基础
- JavaScript 简介
- JavaScript 使用
- JavaScript 输出
- JavaScript 语句
- JavaScript 注释
- JavaScript 变量
- JavaScript 数据类型
- JavaScript 对象
- JavaScript 函数
- JavaScript 运算符
- JavaScript 比较和逻辑运算符
- JavaScript If...Else 语句
- JavaScript Switch 语句
- JavaScript For 循环
- JavaScript While 循环
- JavaScript Break 和 Continue 语句
- JavaScript 错误 - Throw、Try 和 Catch
- JavaScript 表单验证
- JavaScript 保留关键字
- JavaScript JSON
- javascript:void(0) 含义
- JavaScript 高级
- JavaScript 对象
- JavaScript Number 对象
- JavaScript 字符串(String)对象
- JavaScript Date(日期)对象
- JavaScript Array(数组)对象
- JavaScript Boolean(逻辑)对象
- JavaScript Math(算数)对象
- JavaScript RegExp 对象
- JavaScript BOM
- JavaScript Window - 浏览器对象模型
- JavaScript Window Screen
- JavaScript Window Location
- JavaScript Window History
- JavaScript Window Navigator
- JavaScript 消息框
- JavaScript 计时
- JavaScript Cookies
- HTML DOM
- HTML DOM 简介
- HTML DOM 节点
- HTML DOM 方法
- HTML DOM 属性
- HTML DOM 访问
- HTML DOM - 修改
- HTML DOM - 修改 HTML 内容
- HTML DOM - 元素
- HTML DOM - 事件
- HTML DOM - 导航
- JavaScript HTML DOM EventListener
- AJAX 教程
- AJAX 简介
- AJAX 实例
- AJAX - 创建 XMLHttpRequest 对象
- AJAX - 向服务器发送请求
- AJAX - 服务器响应
- AJAX - onreadystatechange 事件
- AJAX ASP/PHP 请求实例
- AJAX 数据库实例
- AJAX XML 实例
- jQuery 基础
- jQuery 简介
- jQuery 安装
- jQuery 语法
- jQuery 选择器
- jQuery 事件
- jQuery 效果
- jQuery 效果 - 隐藏和显示
- jQuery 效果 - 淡入淡出
- jQuery 效果 - 滑动
- jQuery 效果 - 动画
- jQuery 停止动画
- jQuery Callback 函数
- jQuery - Chaining
- jQuery HTML
- jQuery - 获得内容和属性
- jQuery - 设置内容和属性
- jQuery - 添加元素
- jQuery - 删除元素
- jQuery - 获取并设置 CSS 类
- jQuery - css() 方法
- jQuery - 尺寸
- jQuery 遍历
- jQuery 遍历
- jQuery 遍历 - 祖先
- jQuery 遍历 - 后代
- jQuery 遍历 - 同胞
- jQuery 遍历 - 过滤
- jQuery - AJAX
- jQuery - AJAX 简介
- jQuery - AJAX load() 方法
- jQuery - AJAX get() 和 post() 方法
- jQuery 杂项
- jQuery - noConflict() 方法
- JavaScript 高级教程
- JavaScript 的历史
- JavaScript 实现
- ECMAScript 基础
- ECMAScript 语法
- ECMAScript 变量
- ECMAScript 关键字
- ECMAScript 保留字
- ECMAScript 原始值和引用值
- ECMAScript 原始类型
- ECMAScript 类型转换
- ECMAScript 引用类型
- ECMAScript 运算符
- ECMAScript 一元运算符
- ECMAScript 位运算符
- ECMAScript Boolean 运算符
- ECMAScript 乘性运算符
- ECMAScript 加性运算符
- ECMAScript 关系运算符
- ECMAScript 等性运算符
- ECMAScript 条件运算符
- ECMAScript 赋值运算符
- ECMAScript 逗号运算符
- ECMAScript 语句
- ECMAScript if 语句
- ECMAScript 迭代语句
- ECMAScript 标签语句
- ECMAScript break 和 continue 语句
- ECMAScript with 语句
- ECMAScript switch 语句
- ECMAScript 函数
- ECMAScript 函数概述
- ECMAScript arguments 对象
- ECMAScript Function 对象(类)
- ECMAScript 闭包(closure)
- ECMAScript 对象
- ECMAScript 面向对象技术
- ECMAScript 对象应用
- ECMAScript 对象类型
- ECMAScript 对象作用域
- ECMAScript 定义类或对象
- ECMAScript 修改对象
- ECMAScript 继承
- ECMAScript 继承机制实例
- ECMAScript 继承机制实现
- Google 地图API
- Google 地图API Key
- Google Maps 基础
- Google 地图叠加层
- Google 地图事件
- Google 地图控件集
- Google 地图类型
- Google 地图 API 参考手册
- 地图 API Map() 构造器
- 免责声明