JavaScript深入之数据类型

一、内置类型

最新的 ECMAScript 标准定义了 7 种数据类型:

  • 空值(null)
  • 未定义(undefined)
  • 布尔值(boolean)
  • 数字(number)
  • 字符串(string)
  • 符号(symbol,ES6 中新增)
  • 对象(object)

除对象为“复杂类型”之外,其他统称为“基本类型”。

二、typeof 操作符

JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据,我们可以通过 typeof 操作符来判断变量的类型。

1
2
3
4
5
6
7
8
9
10
11
typeof undefined; // "undefined"
typeof true; // "boolean"
typeof 42; // "number";
typeof '42'; // "string";
typeof Symbol(); // "symbol"

typeof null; // "object"?

typeof { life: 42 }; // "object"
typeof [1, 2, 3]; // "object"
typeof function foo() {}; // "function"

null 比较 特殊 , typeof 对它的处理有问题,正确的返回结果应该是 “null” , 但这个 bug 由来已久, 在 JavaScript 中已经存在了将近 二十年,也许永远也不会修复,因为这牵涉到太多的 Web 系统,“修复”它会 产生 更多的 bug, 令许多系统无法正常工作。
V8 曾经修正并实现过 typeof null === ‘null’,但最终证明不可行。http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null

查阅 ECMAScript 规范就会知道, Object 类型包含 Function、Array、Date、RegExp 等。

三、原始值( primitive values )

Undefined 类型

一个没有被赋值的变量会有个默认值 undefined

Null 类型

Null 类型只有一个值 null。从逻辑角度来看,null 值表 示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回”object”的原因

布尔类型

布尔表示一个逻辑实体,可以有两个值:true 和 false,要将一个值转换为其对应的 Boolean 值,可以调用转型函数 Boolean()

数据类型 转换为 true 的值 转换成 false 的值
string 任何非空字符串 “”(空字符串)
number 任何非零数值(包括无穷大、无穷小) 0 和 NaN
object 任何对象 null
undefined undefined
symbol 任何符号

数字类型

根据 ECMAScript 标准,JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(2^63 -1) 到 2^63 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity(正无穷),-Infinity(负无穷) 和 NaN (非数值,Not-a-Number)。

要检查值是否大于或小于 +/-Infinity,你可以使用常量 Number.MAX_VALUE 和 Number.MIN_VALUE。
在 ECMAScript 6 中,你也可以通过 Number.isSafeInteger() 方法还有 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 来检查值是否在双精度浮点数的取值范围内。

字符串类型节

JavaScript 的字符串类型用于表示文本数据。它是一组 16 位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为 0,下一个是索引 1,依此类推。字符串的长度是它的元素的数量。

不同于类 C 语言,JavaScript 字符串是不可更改的。这意味着字符串一旦被创建,就不能被修改。但是,可以基于对原始字符串的操作来创建新的字符串。例如:

  • 获取一个字符串的子串可通过选择个别字母或者使用 String.substr().
  • 两个字符串的连接使用连接操作符 (+) 或者 String.concat().

注意代码中的“字符串类型”!可以使用字符串来表达复杂的数据。以下是一些很好的性质:

  • 容易连接构造复杂的字串符
  • 字符串容易被调试(你看到的往往在字符串里)
  • 字符串通常是许多 APIs 的常见标准 (input fields, local storage values, XMLHttpRequest 当使用 responseText 等的时候回应) 而且他只能与字符串一同使用。

按照惯例, 字符串一般可以用来表达任何数据结构。这不是一个好主意。例如,使用一个分隔符,一个可以模仿一个列表(一个 JavaScript 的数组可能更适合一些) 。不幸的是,当一个分隔符在用于列表中的元素时,打乱了这个列表。 一个转义字符等。所有这些惯例都变成了一个不存在的维护负担而没有正确的工具使用。

表达文本数据和符号数据时候推荐使用字符串。当表达复杂的数据时,使用字符串解析和适当的缩写。

符号类型

符号(Symbols)是 ECMAScript 第 6 版新定义的。符号类型是唯一的并且是不可修改的, 并且也可以用来作为 Object 的 key 的值。

参考文档

JavaScript 高级程序设计(第 3 版)
你不知道的 JavaScript(中卷)
JavaScript 数据类型和数据结构