JavaScript 的值是有类型的。比如,是一个字符串或者是一个数值。
JavaScript 共包含 8 个数据类型。本篇会对它们笼统做个介绍,在随后的章节再详细地讲解。
JavaScript 中的变量可以存储任意类型的值。比如说,某个变量现在存储是个字符串,也可以赋值成为数值。
// 没有错误
let message = "hello";
message = 123456;
编程语言里这称为“动态类型”。也就是说,JavaScript 存在数据类型,但是变量并不会与某个数据类型做强绑定。
数值
let n = 123;
n = 12.345;
数值类型包含整数和浮点数。
有许多用来操作数值的运算符,比如:乘 *
,除 /
,加 +
,减 -
等等。
除了常规数值,还有一些“特殊数值”:Infinity
,-Infinity
和 NaN
。
Infinity
就表示数学里的无穷大(∞),比任何数值都大。
拿一个数除以 0
就能得到无穷大:
alert( 1 / 0 ); // Infinity
或者使用字面量形式直接引入:
alert( Infinity ); // Infinity
NaN
表示一个计算错误。某个算术运算不正确或者未定义数学运算就会产生这个值。
alert( 'not a number' / 2 ); // NaN, 这样除是不对的
NaN
比较有趣的一个地方是,与 NaN
进行的任何运算,结果都是 NaN
:
alert( 'not a number' / 2 + 5 ); // NaN
因此,在算术运算中,一旦有地方出现 NaN
,那么结果必然是 NaN
。
⚠️ 算术运算是安全的
JavaScript 中的算术运算是安全的。我们可以做任何事:除以
0
,把非数字字符串当作数字用等等。脚本永远不会因为这样的错误终止执行。在最坏的情况下,我们也只是得到结果
NaN
。
特殊的数值也属于“数值”类型。当然,他们并不是一般意义上的的数值。
我们会在后续的《数值》一章里学到更多关于操作数值的知识。
BigInt
JavaScript 中的“数值”不能准确标识大于 (也就是 9007199254740991)和小于的整数。这是受到内部实现上的限制。
不过这个限制并不会影响多数场景的运算。但有时我们确实需要进行大数运算,比如密码学或是微秒级精度的时间戳运算。
BigInt
类型就是为大数运算而生的,用于进行任意精度的整数运算。
BigInt
值通过在普通数值后面加上 n
来声明:
// 末尾的 "n" 表示这个一个 BigInt 类型值
const bigInt = 1234567890123456789012345678901234567890n;
BigInt
值很少使用,我们不会在本篇讲述,有单独一章对它做了讨论。你只要在需要的时候阅读即可。
⚠️ 浏览器兼容性
IE 浏览器不支持
BigInt
类型,Firefox/Chrome/Edge/Safari 是支持的。
可以参看 MDN BigInt 兼容性表格 看到具体在哪个浏览器版本中支持。
字符串
JavaScript 中的字符串使用引号包围。
let str = 'Hello';
let str2 = '使用单引号也 OK';
let phrase = `还可以内嵌字符串 ${str}`;
一共有三种形式的引号:
- 双引号:
"Hello"
。 - 单引号:
'Hello'
。 - 反引号:
Hello
。
双引号和单引号是“简单”引号,它们之间没有区别。
反引号是具有“扩展功能”的引号,能通过 ${...}
符号嵌入变量或表达式。
let name = "John";
// 内嵌一个变量
alert( `Hello, ${name}!` ); // Hello, John!
// 内嵌一个表达式
alert( `结果是 ${1 + 2}` ); // 结果是 3
${...}
中的表达式解析后、返回的结果成为字符串的一部分。我们可以在其中嵌套任何形式的变量或表达式:比如,上面代码里的 name
还有像 1 + 2
这样的表达式,或者更加复杂一些的。
需要注意的是,${...}
这个符号只能在使用反引号声明的字符串中使用,单/双引号声明的字符串是不能使用的。
alert( "结果是 ${1 + 2}" ); // 结果是 "${1 + 2}" (双引号里不支持使用 ${} 符号)
我们将在后续的《字符串》一章中,更加全面地介绍字符串方面的知识。
⚠️ 没有字符类型
在其他的一些言中,有专门用来存储单个字符的字符类型。例如,C 和 Java 语言中的
char
。JavaScript 只有一种字符串类型string
,没有字符类型。一个字符串可以为空、也可以由一个或多个字符组成。
布尔(逻辑类型)
布尔类型仅包含两个值:true
和 false
。
布尔类型通常用来存储表示是/否的值:true
表示“是、对的”,false
表示“否、不对的”。
比如:
let nameFieldChecked = true; // yes, name 字段被选中了
let ageFieldChecked = false; // no, age 字段没有被选中
比较操作的结果就是布尔值:
let isGreater = 4 > 1;
alert( isGreater ); // true (比较结果为 "是")
后续《逻辑运算符》一章中,我们会更加深入地学习 逻辑运算符 的相关知识。
null
null
是一个特殊的值,不属于上面讲的任何一种类型。
它有自己所属的类型,而且这个类型里只包含它一个值:
let age = null;
在 JavaScript 中,null
表示“对一个不存在对象的引用”,类似于其他语言中所讲的“空指针”。
null
只是一个特殊的表示“没东西”、“空”或者“未知值”。
上面的代码里的 age
因为某些原因,它的值给了 null
,就表示现在还未知(或者说是空的)。
undefined
undefined
跟 null
一样,也是一个特殊值,也有自己所属的类型。
undefined
的意思是“没有赋值”。
如果变量声明但没有赋值,默认就是 undefined
:
let x;
alert(x); // "undefined"
技术上可以将 undefined
赋给任何变量:
let x = 123;
x = undefined;
alert(x); // "undefined"
但通常不建议这样做。正常来说,我们使用 null
表示一个“空”或者“未知值”,undefined
作为未赋值情况下的默认初始值。
Object 和 Symbol
object
类型比较特别。
所有其他类型都被称为“原始类型”,因为它们的值就是简单的一个数据(不管是字符串还是数字,或者其他什么)。与此不同的是,对象是用来存储数据集合和更复杂的数据结构的。我们在学完原始类型后,再在《对象》一章里着重介绍它们。
symbol
类型是用来为对象创建唯一标识符的。为了教程完整性我们在这里提到它,学完对象后,我们就会学习它。
typeof 运算符
typeof
运算符返回参数类型。当我们想要根据数据类型用不同的方式处理时,可以使用它。或者只是想检查一下参数类型,也是有用的。
typeof
运算符支持两种语法:
- 作为运算符:
typeof x
。 - 作为函数:
typeof(x)
。
换句话说,它后面既可以跟括号,也可以不跟。返回结果都是一样的。
调用 typeof x
,会返回一个由字符串表示的参数类型:
typeof undefined // "undefined"
typeof true // "boolean"
typeof 0 // "number"
typeof 'foo' // "string"
typeof Symbol('id') // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
最后三行需要额外解释一下:
- 内置的 Math 对象上提供了一些参与算术运算的方法/属性,我们将在后面《数值》一章里学到它。在这里使用,是为了说明它是一个对象。
typeof null
的结果是"object"
,这是一个语言设计错误。但为了保证与之前代码兼容,这个行为依然被保留了。null
不是对象,它是一个特殊值,有自己所属的数据类型 。typeof alert
的结果是"function"
,因为alert
是一个语言内置函数。我们将在下一章里学习函数,你会知道,JavaScript 语言中并没有特殊的“函数”类型。函数属于对象。但typeof
对函数的处理稍有不同,返回了“function”。技术上讲,这个结果是不正确的,但却比较实用。
总结
JavaScript 语言中一共包含八种数据类型。
number
:表示任意数值,包括整数或者浮点数。能准确表达的整数范围是。bigint
:用于任意精度的整数运算。string
:字符串,由零或多个字符组成,JavaScript 中没有字符类型。boolean
:布尔值,包括true
/false
。null
:表示未知值。有自己所属的类型,且只有它一个值。undefined
:表示没有赋值。有自己所属的类型,且只有它一个值。object
:用于表示更复杂的数据类型。symbol
:用作唯一标识符。
typeof
操作符用来查看变量中存储的值的类型。
- 两种使用方式:
typeof x
或typeof(x)
。 - 返回类型的字符串表示,比如
"string"
。 typeof null
的结果是"object"
:这是语言设计上的一个错误,事实上,null
并不是对象。
后续的章节里,我们将学习原始类型值,之后再学习对象方面的知识。
(完)
📄 文档信息
🕘 更新时间:2021/09/22
🔗 原文链接:https://javascript.info/types