JavaScript 的值是有类型的。比如,是一个字符串或者是一个数值。

JavaScript 共包含 8 个数据类型。本篇会对它们笼统做个介绍,在随后的章节再详细地讲解。

JavaScript 中的变量可以存储任意类型的值。比如说,某个变量现在存储是个字符串,也可以赋值成为数值。

  1. // 没有错误
  2. let message = "hello";
  3. message = 123456;

编程语言里这称为“动态类型”。也就是说,JavaScript 存在数据类型,但是变量并不会与某个数据类型做强绑定。

数值

  1. let n = 123;
  2. n = 12.345;

数值类型包含整数和浮点数。

有许多用来操作数值的运算符,比如:乘 *,除 /,加 +,减 - 等等。

除了常规数值,还有一些“特殊数值”:Infinity-InfinityNaN

  • Infinity 就表示数学里的无穷大(∞),比任何数值都大。

拿一个数除以 0 就能得到无穷大:

  1. alert( 1 / 0 ); // Infinity

或者使用字面量形式直接引入:

  1. alert( Infinity ); // Infinity
  • NaN 表示一个计算错误。某个算术运算不正确或者未定义数学运算就会产生这个值。
  1. alert( 'not a number' / 2 ); // NaN, 这样除是不对的

NaN 比较有趣的一个地方是,与 NaN 进行的任何运算,结果都是 NaN

  1. alert( 'not a number' / 2 + 5 ); // NaN

因此,在算术运算中,一旦有地方出现 NaN,那么结果必然是 NaN

⚠️ 算术运算是安全的

JavaScript 中的算术运算是安全的。我们可以做任何事:除以 0,把非数字字符串当作数字用等等。

脚本永远不会因为这样的错误终止执行。在最坏的情况下,我们也只是得到结果 NaN

特殊的数值也属于“数值”类型。当然,他们并不是一般意义上的的数值。

我们会在后续的《数值》一章里学到更多关于操作数值的知识。

BigInt

JavaScript 中的“数值”不能准确标识大于 数据类型 - 图1 (也就是 9007199254740991)和小于数据类型 - 图2的整数。这是受到内部实现上的限制。

不过这个限制并不会影响多数场景的运算。但有时我们确实需要进行大数运算,比如密码学或是微秒级精度的时间戳运算。

BigInt 类型就是为大数运算而生的,用于进行任意精度的整数运算。

BigInt 值通过在普通数值后面加上 n 来声明:

  1. // 末尾的 "n" 表示这个一个 BigInt 类型值
  2. const bigInt = 1234567890123456789012345678901234567890n;

BigInt 值很少使用,我们不会在本篇讲述,有单独一章对它做了讨论。你只要在需要的时候阅读即可。

⚠️ 浏览器兼容性

IE 浏览器不支持 BigInt 类型,Firefox/Chrome/Edge/Safari 是支持的。

可以参看 MDN BigInt 兼容性表格 看到具体在哪个浏览器版本中支持。

字符串

JavaScript 中的字符串使用引号包围。

  1. let str = 'Hello';
  2. let str2 = '使用单引号也 OK';
  3. let phrase = `还可以内嵌字符串 ${str}`;

一共有三种形式的引号:

  1. 双引号:"Hello"
  2. 单引号:'Hello'
  3. 反引号:Hello

双引号和单引号是“简单”引号,它们之间没有区别。

反引号是具有“扩展功能”的引号,能通过 ${...} 符号嵌入变量或表达式。

  1. let name = "John";
  2. // 内嵌一个变量
  3. alert( `Hello, ${name}!` ); // Hello, John!
  4. // 内嵌一个表达式
  5. alert( `结果是 ${1 + 2}` ); // 结果是 3

${...} 中的表达式解析后、返回的结果成为字符串的一部分。我们可以在其中嵌套任何形式的变量或表达式:比如,上面代码里的 name 还有像 1 + 2 这样的表达式,或者更加复杂一些的。

需要注意的是,${...} 这个符号只能在使用反引号声明的字符串中使用,单/双引号声明的字符串是不能使用的。

  1. alert( "结果是 ${1 + 2}" ); // 结果是 "${1 + 2}" (双引号里不支持使用 ${} 符号)


我们将在后续的《字符串》一章中,更加全面地介绍字符串方面的知识。

⚠️ 没有字符类型

在其他的一些言中,有专门用来存储单个字符的字符类型。例如,C 和 Java 语言中的 char。JavaScript 只有一种字符串类型 string,没有字符类型。一个字符串可以为空、也可以由一个或多个字符组成。

布尔(逻辑类型)

布尔类型仅包含两个值:truefalse

布尔类型通常用来存储表示是/否的值:true 表示“是、对的”,false 表示“否、不对的”。

比如:

  1. let nameFieldChecked = true; // yes, name 字段被选中了
  2. let ageFieldChecked = false; // no, age 字段没有被选中

比较操作的结果就是布尔值:

  1. let isGreater = 4 > 1;
  2. alert( isGreater ); // true (比较结果为 "是")

后续《逻辑运算符》一章中,我们会更加深入地学习 逻辑运算符 的相关知识。

null

null 是一个特殊的值,不属于上面讲的任何一种类型。

它有自己所属的类型,而且这个类型里只包含它一个值:

  1. let age = null;

在 JavaScript 中,null 表示“对一个不存在对象的引用”,类似于其他语言中所讲的“空指针”。

null 只是一个特殊的表示“没东西”、“空”或者“未知值”。

上面的代码里的 age 因为某些原因,它的值给了 null,就表示现在还未知(或者说是空的)。

undefined

undefinednull 一样,也是一个特殊值,也有自己所属的类型。

undefined 的意思是“没有赋值”。

如果变量声明但没有赋值,默认就是 undefined

  1. let x;
  2. alert(x); // "undefined"

技术上可以将 undefined 赋给任何变量:

  1. let x = 123;
  2. x = undefined;
  3. alert(x); // "undefined"

但通常不建议这样做。正常来说,我们使用 null 表示一个“空”或者“未知值”,undefined 作为未赋值情况下的默认初始值。

Object 和 Symbol

object 类型比较特别。

所有其他类型都被称为“原始类型”,因为它们的值就是简单的一个数据(不管是字符串还是数字,或者其他什么)。与此不同的是,对象是用来存储数据集合和更复杂的数据结构的。我们在学完原始类型后,再在《对象》一章里着重介绍它们。

symbol 类型是用来为对象创建唯一标识符的。为了教程完整性我们在这里提到它,学完对象后,我们就会学习它。

typeof 运算符

typeof 运算符返回参数类型。当我们想要根据数据类型用不同的方式处理时,可以使用它。或者只是想检查一下参数类型,也是有用的。

typeof 运算符支持两种语法:

  1. 作为运算符:typeof x
  2. 作为函数:typeof(x)

换句话说,它后面既可以跟括号,也可以不跟。返回结果都是一样的。

调用 typeof x,会返回一个由字符串表示的参数类型:

  1. typeof undefined // "undefined"
  2. typeof true // "boolean"
  3. typeof 0 // "number"
  4. typeof 'foo' // "string"
  5. typeof Symbol('id') // "symbol"
  6. typeof Math // "object" (1)
  7. typeof null // "object" (2)
  8. typeof alert // "function" (3)

最后三行需要额外解释一下:

  1. 内置的 Math 对象上提供了一些参与算术运算的方法/属性,我们将在后面《数值》一章里学到它。在这里使用,是为了说明它是一个对象。
  2. typeof null 的结果是 "object",这是一个语言设计错误。但为了保证与之前代码兼容,这个行为依然被保留了。null 不是对象,它是一个特殊值,有自己所属的数据类型 。
  3. typeof alert 的结果是 "function",因为 alert 是一个语言内置函数。我们将在下一章里学习函数,你会知道,JavaScript 语言中并没有特殊的“函数”类型。函数属于对象。但 typeof 对函数的处理稍有不同,返回了“function”。技术上讲,这个结果是不正确的,但却比较实用。

总结

JavaScript 语言中一共包含八种数据类型。

  • number:表示任意数值,包括整数或者浮点数。能准确表达的整数范围是。
  • bigint:用于任意精度的整数运算。
  • string:字符串,由零或多个字符组成,JavaScript 中没有字符类型。
  • boolean:布尔值,包括 true/false
  • null:表示未知值。有自己所属的类型,且只有它一个值。
  • undefined:表示没有赋值。有自己所属的类型,且只有它一个值。
  • object:用于表示更复杂的数据类型。
  • symbol:用作唯一标识符。

typeof 操作符用来查看变量中存储的值的类型。

  • 两种使用方式:typeof xtypeof(x)
  • 返回类型的字符串表示,比如 "string"
  • typeof null 的结果是 "object":这是语言设计上的一个错误,事实上,null 并不是对象。

后续的章节里,我们将学习原始类型值,之后再学习对象方面的知识。

(完)



📄 文档信息

🕘 更新时间:2021/09/22
🔗 原文链接:https://javascript.info/types