JavaScript 语言有两种类型:原始类型(Primitive Type) 和 引用类型(Reference Type)。
原始类型包括:大整数类型(不可变的)、数值类型(不可变的)、布尔类型(不可变的)、字符串类型(不可变的)、符号类型(不可变的)、Undefined类型(不可变的)、Null类型(不可变的)。
引用类型包括:对象类型(可变的)、函数类型(可变的)、数组类型(可变的)、映射类型(可变的)、集合类型(可变的)、生成器类型(可变的)、期约类型(可变的)。
不可变的(immutable):又称为不可修改的,新值存储在新的内存地址,老值占用的内存随后被垃圾回收。
可变的(mutable):又称为可修改的,新值存储在老的内存地址。
1.大整数(BigInt)类型
可以在一个任意精度整数后跟一个小写字母 n
定义一个大整数。
注意:小写字母 n
只是为了将大整数与下述数值类型中的整数区分。
//二进制
0b11101001010101010101n
//八进制
0o777777777777n
//十进制
123456789123456789n
//十六进制
0x123456789ABCDEFn
类型 | 范围 | 包装的引用类型 |
BigInt | 任意精度整数 | BigInt |
关于进制部分,与下述数值类型描述一样。
关于下划线部分,与下述数值类型描述一样。
2.数值(Number)类型
数值类型遵循IEEE 754二进制浮点算术标准。
数值类型同时表示整数和浮点数。因为存储浮点数使用的内存空间是存储整数的两倍,所以在底层 JavaScript 会尽量转换成整数,在无法转换为整数的时候,则使用浮点数。
//整数
let a = 8;
//小数点后没有数字,则浮点数1.会被转换为整数1来处理。
let a = 1.;
//小数点后为数字0,则浮点数1.0会被转换为整数1来处理。
let a = 1.0;
//浮点数(小数点后至少有一个数字)
let b = 0.1;
//小数点前没有数字,则会被当成浮点数0.1来处理,但不推荐。
let b = .1;
数值类型中的整数和浮点数可以使用科学记数法(十进制)来表示:一个数值(整数或浮点数)后跟一个大写或小写的字母 e
(表示乘以 10
),再跟一个前面的乘以 10
的多少次幂。
类型 | 范围 | 包装的引用类型 |
Number | 整数(精确值):-9 007 199 254 740 992(-253) ≤ n ≤ 9 007 199 254 740 992(253) 浮点数(非精确值): ±5e-324(±2-1074) ≤ n ≤ ±1.797 693 134 862 315 7e+308(±21024 - 2971) | Number |
数值类型还包括五个特殊的值:
值 | 描述 | 示例 |
Infinity (正无穷)、-Infinity (负无穷) | 任何无法表示的最大正数或最小负数。 | 1/0 // Infinity -1/0 // -Infinity |
+0 (正零)、-0 (负零) | 任何无法表示的最小正数或最大负数。相等性详见“相等性运算符”章节。 | 1/Infinity // 0 -1/Infinity // -0 |
NaN (Not a Number,非数值) | 在数学运算中,当遇到一些无法运算的情况时,其它一些编程语言会抛出错误,而 JavaScript 语言使用 NaN 表示这种情况,而不是抛出错误。相等性详见“相等性运算符”章节。 | 0/0 // NaN "张三"/2 // NaN |
进制 | 描述 |
二进制 | 以 0b (零和小写字母b) 或 0B (零和大写字母B) 开头,后续只能包含数字 0 和 1。 |
八进制 | 以 0 (零) 或 0o (零和小写字母o) 或 0O (零和大写字母O) 开头,后续只能包含数字(0~7)。严格模式下,不支持以 0 (零) 开头。 |
十进制 | 单个数字 0 (零)。或 以 1~9 开头,后续只能包含数字(0~9)。 |
十六进制 | 以 0x (零和小写字母x) 或 0X (零和大写字母X) 开头,后续只能包含 数字(0~9) 和 字母(a~f 或 A~F)。字母(a~f 或 A~F) 表示数字 10 到 15。 |
为了提高数值的可读性,下划线(_
,U+005F
)可以用作分隔符,解析时会被 JavaScript 解释器移除。
//作为千分位分隔符
1_000_000_000
0.123_456_789
//作为字节分隔符
0x89_AB_CD_EF
//作为半字节分隔符
0b0001_1101_0111
//大整数类型
1_000_000_000_000_000_000_000n
3.布尔(Boolean)类型
类型 | 值 | 包装的引用类型 |
Boolean | true 或 false (其它的大小写混写形式都是有效的标识符,但不是布尔值) | Boolean |
以下类型中的这些值被 Boolean()
函数转换以后都是 false
,除此之外的任何其它值(包括 true
)都是 true
。
类型 | 这些值被 Boolean() 函数转换以后都是 false |
BigInt | 0n |
Number | 0 、+0 、-0 、NaN |
Boolean | false |
String | '' 、"" 、`` (空字符串) |
Undefined | undefined |
Null | null |
4.字符串(String)类型
类型 | 描述 | 包装的引用类型 |
String | 具体见字符串章节。 | String |
5.符号(Symbol)类型
类型 | 描述 | 包装的引用类型 |
Symbol | 具体见符号章节。 | Symbol |
6.Undefined类型
类型 | 值 | 描述 | 包装的引用类型 |
Undefined | undefined | 表示变量已声明但未初始化。如果一个变量已声明但未初始化,则此变量会被自动赋予 undefined 值。 | —————— |
注意:无论是已声明未初始化还是未声明未初始化,typeof
运算符都会返回 "undefined"
。因此我们可以在声明变量的时候进行初始化,这样,当 typeof
运算符返回 "undefined"
时,我们就会知道那是因为变量未声明未初始化,而不是已声明未初始化。
//变量b不存在
'use strict';
let a;
type a; // "undefined"
type b; // "undefined"
7.Null类型
类型 | 值 | 描述 | 包装的引用类型 |
Null | null | 表示变量已声明且已初始化。如果一个变量将来需要保存对象,但此时又需要初始化时,可以使用 null 值来初始化该变量。 | —————— |
8.对象(Object)类型
Object
是所有类型的基类型。
类型 | 描述 |
Object | 具体见类章节。 |
9.函数(Function)类型
类型 | 描述 |
Function | 具体见函数章节。 |
10.数组(Array)类型
类型 | 数组长度 | 描述 |
Array | 0 ≤ length ≤ 4 294 967 295(232-1) | 具体见数组章节。 |
11.映射(Map)类型
类型 | 描述 |
Map | 具体见映射章节。 |
12.集合(Set)类型
类型 | 描述 |
Set | 具体见集合章节。 |
13.生成器(Generator)类型
类型 | 描述 |
Generator | 具体见生成器章节。 |
14.期约(Promise)类型
类型 | 描述 |
Promise | 具体见期约章节。 |
15.类型转换
类型转换函数 | 描述 |
BigInt() | 转换为大整数类型(原始类型)。 |
Number() | 转换为数值类型(原始类型)。 |
Boolean() | 转换为布尔类型(原始类型)。 |
String() | 转换为字符串类型(原始类型)。 |
Object() | 转换为对象类型。 |
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/javascript/javascriptlang/4735.html