JavaScript基本数据类型有哪些:String、Number到BigInt完整列表

作者:木棉

时间:2026-10-30

浏览:367

全面梳理 JavaScript 规范中定义的 7 种基本数据类型:String、Number、Boolean、Undefined、Null、Symbol 到 BigInt。深入剖析其存储机制、常见判定陷阱与核心使用场景。

文章目录

在当前的 ECMAScript 规范中,JavaScript 一共定义了 7 种基本数据类型(Primitive Types,通常也被称为原始类型),分别是:String(字符串)、Number(数值)、Boolean(布尔值)、Undefined(未定义)、Null(空值)、Symbol(符号,ES6 引入)以及 BigInt(大整数,ES2020 引入)。除这 7 种基本类型之外,JavaScript 中其余所有结构(如对象、数组、函数、正则表达式、日期等)统属于唯一的引用类型——Object。掌握这 7 种基本类型的边界、内存特性及类型判定规则,是编写可靠 JavaScript 代码的核心基石。

一、JavaScript 数据类型的整体架构与基本类型的特征

理解基本数据类型的首要关键,在于认清它与“引用类型(Object)”在内存分配与操作方式上的本质差异。在 JavaScript 的运行机制中,数据类型被划分为两大阵营:

  • 按值存储与访问(基本数据类型): 基本类型的值直接保存在栈内存(Stack)中,占用固定大小的空间。当一个变量赋值给另一个变量时,复制的是该数值的完整副本,两个变量各自独立,互不影响。
  • 不可变性(Immutability): 所有基本类型的值一旦创建,其本身是绝对不可更改的。任何看似修改字符串或数值的方法(如 str.toUpperCase()),返回的都是全新创建的原始值,原值依然保持不变。
  • 无属性与方法: 基本类型本质上没有属性和方法。我们在字符串上可以调用 .length 或 .slice(),是因为 JavaScript 引擎会在访问瞬间自动创建对应的“包装对象”(如 String 实例),并在调用结束后立即销毁该临时对象。
JavaScript基本数据类型有哪些:String、Number到BigInt完整列表
图 1:JavaScript 整体数据类型分类与内存模型示意图

二、7 种基本数据类型完整清单与深入剖析

从 JavaScript 诞生之初的经典 5 种基本类型,到 ES6 补充的 Symbol,再到 ES2020 引入的 BigInt,基本数据类型的扩充反映了语言在安全性与计算精度方面的演进。以下是 7 种基本类型的完整解析:

1. String(字符串)

String 用于表示文本序列,由零个或多个 16 位 Unicode 字符(UTF-16 代码单元)组成。字符串字面量支持单引号 ''、双引号 "" 以及反引号 ``(ES6 模板字符串)。

const greeting = "Hello, world";
const name = 'Alice';
const message = `欢迎 ${name}!`; // 模板字符串支持表达式插值与多行换行

注意: 字符串的字符索引是只读的。通过 str[0] = 'h' 不会报错(非严格模式)但也无法修改原字符串,必须通过重新拼接并赋值给变量来体现修改。

2. Number(数值)

不同于多数强类型语言区分整数与浮点数,JavaScript 的 Number 类型统一采用 IEEE 754 双精度 64 位浮点格式 表示。这意味着不管是整数 42 还是浮点数 3.14,底层结构完全相同。

  • 数值范围: 安全整数区间为 [-(2^53 - 1), 2^53 - 1],即 Number.MIN_SAFE_INTEGER 到 Number.MAX_SAFE_INTEGER(9007199254740991)。超出此范围的整数可能丢失精度。
  • 特殊数值: 包含 Infinity(正无穷大)、-Infinity(负无穷大)以及 NaN(Not-a-Number,非有效数值)。
const count = 100;
const price = 19.99;
const invalid = 0 / 0; // 得到 NaN
console.log(typeof NaN); // 输出 "number"

3. Boolean(布尔值)

Boolean 类型仅有两个字面量取值:true 和 false,用于逻辑分支判断。在条件判断语句(如 if)中,非布尔值会被隐式强制转换为布尔值。

在 JavaScript 中,只有以下 8 个值会被转换为 false(称为虚值/Falsy values),其余所有值(包括空对象 {}、空数组 [])均转换为 true:

// 8 个 falsy 值:
false, 0, -0, 0n (BigInt), "", null, undefined, NaN

4. Undefined(未定义)

Undefined 类型只有一个单一值,即 undefined。它表示“变量已声明,但尚未被赋予具体值”的默认初始状态。此外,访问对象不存在的属性、函数没有明确 return 语句时的返回值,均为 undefined。

let initialized;
console.log(initialized); // undefined

function doNothing() {}
console.log(doNothing()); // undefined

5. Null(空值)

Null 类型同样只有一个值,即 null。它在语义上表示“故意缺少任何对象值”,常作为尚未创建或已释放对象的占位符。尽管语义上与 undefined 类似,但约定中:undefined 表示系统级或意外的未赋值状态,而 null 则表示开发者主动设置的空引用。

let currentUser = null; // 明确表示当前没有登录用户
// 稍后登录成功时赋值为对象
currentUser = { id: 101, name: "Bob" };

6. Symbol(符号,ES6 引入)

Symbol 是在 ECMAScript 2015(ES6)中作为第 6 个基本类型加入的。每个通过 Symbol() 函数创建的 symbol 值都是全局唯一的,即使传入相同的描述字符串也不相等。它主要用于创建不可覆盖的对象属性名,以及实现语言内部的元编程钩子(如 Symbol.iterator)。

const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false

const obj = {
  [id1]: "私有编号 1001"
};
// 无法通过常规的 Object.keys() 或 for...in 枚举该属性

注意: Symbol 是唯一一个不能通过构造函数 new Symbol() 实例化的内置类型,直接调用函数即可生成原始符号。

7. BigInt(大整数,ES2020 引入)

BigInt 是 ECMAScript 2020(ES11)正式标准化的第 7 个基本数据类型。由于 Number 类型的最大安全整数为 2^53 - 1,在处理高精度时间戳、雪花 ID(Snowflake ID)或金融大额运算时极易发生精度截断。BigInt 的出现彻底解决了这个问题,它可以表示任意精度的无界整数。

字面量通过在整数末尾添加小写字母 n,或者调用 BigInt() 转换函数创建:

const safeMax = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(safeMax + 1 === safeMax + 2); // true(超出安全整数,精度失效!)

const big1 = 9007199254740991n;
console.log(big1 + 1n === big1 + 2n);    // false(BigInt 保持绝对精确)
const big2 = BigInt("123456789012345678901234567890");
JavaScript基本数据类型有哪些:String、Number到BigInt完整列表
图 2:JavaScript 7 种基本数据类型的演进阶段与职责划分

三、类型检测方式与容易混淆的 4 大陷阱辨析

日常编码中,判断变量是否为某种基本类型最常用的操作符是 typeof。然而,typeof 的行为存在历史遗留设计和边界特例,需要掌握其规律与修正方案。

1. 陷阱一:typeof null === "object" 为什么会成立?

初学者常常因 typeof null === "object" 而误以为 null 是对象或引用类型。实际上,null 是不折不扣的基本数据类型。

这一现象源于 JavaScript 第一个版本的设计缺陷:在当时的底层 C 语言实现中,值的机器码标签占低 3 位,若低 3 位是 000 则代表是对象引用。而 null 被设计为空指针(即全零的 NULL 指针),其低 3 位也是 000,导致类型检查引擎直接误判其为 object。这个 Bug 已经写入 Web 规范无法更正(否则会导致数以亿计的历史网站崩溃)。

正确修正方案: 不要使用 typeof 检验 null,直接使用严格全等运算符:

function isNull(val) {
  return val === null; // 精确且无副作用
}

2. 陷阱二:NaN 既然是“Not a Number”,为什么 typeof NaN === "number"?

在数值计算失败(如 "abc" / 2)或解析非法字符串时,结果会得到 NaN。虽然它字面意思是“不是一个数字”,但它是 IEEE 754 浮点数规范中定义的一种特殊的“无效数值状态”,因此在类型系统归类上,它依然属于 number。

同时,NaN 拥有整个 JavaScript 中唯一的特性:它与任何值都不相等,包括它自己(NaN === NaN 为 false)。

// 错误检测方式:
const res = Number("xyz");
if (res === NaN) { /* 永远不会执行! */ }

// 正确检测方式:
if (Number.isNaN(res)) {
  console.log("确实是无效的数值 NaN");
}

3. 陷阱三:原始值的“不可变性”与变量重新赋值的混淆

经常有开发者疑惑:“如果字符串是不可变的基本类型,为什么我可以写 let s = 'a'; s = 'b'; 成功修改?”

这里混淆了“变量绑定的指向”与“内存中的值本身”。上述代码并没有修改字符 'a',而是新创建了字符 'b',并将变量 s 的指针重新指向了 'b',原字符 'a' 完好无损地等待垃圾回收。对比引用类型:对于对象 const obj = { x: 1 }; obj.x = 2;,变量绑定没有变,但对象内部的堆内存数据被直接原地修改了。

4. 陷阱四:BigInt 无法与 Number 直接隐式混算

为了防止开发者在无意识中丢失高位精度,ECMAScript 明确禁止 BigInt 与 Number 进行隐式类型转换及混合运算:

const count = 10n;
const delta = 5;

// TypeError: Cannot mix BigInt and other types, use explicit conversions
// const total = count + delta; 

// 正确做法:显式转换类型
const totalBig = count + BigInt(delta); // 15n
const totalNum = Number(count) + delta; // 15(注意:超大数可能丢失精度)
JavaScript基本数据类型有哪些:String、Number到BigInt完整列表
图 3:typeof 操作符行为判定树与 Null 异常分支识别路径

四、7 种基本数据类型全景特性与选用对照表

为便于系统性记忆与工程选型,下表对 7 种基本数据类型在字面量语法、规范引入版本、类型判断返回值及常见应用场景进行了横向汇总:

类型名称 标准字面量语法 引入版本 typeof 返回值 核心场景与主要注意事项
String "abc", 'text', `Hi ${x}` ES1 (1997) "string" 文本表示与拼接;值本身不可变,字符索引只读。
Number 42, 3.14, 0xFF, NaN ES1 (1997) "number" 常规数值运算;安全上限 2^53 - 1;NaN 需用 Number.isNaN() 判定。
Boolean true, false ES1 (1997) "boolean" 条件分支逻辑;牢记 8 个隐式转 false 的 falsy 假值列表。
Undefined undefined ES1 (1997) "undefined" 变量已声明但未赋值的系统级缺省状态;函数默认无返回时的返回值。
Null null ES1 (1997) "object" (历史特例) 主动声明“空对象引用”;严禁用 typeof 检测,必须用 === null。
Symbol Symbol("desc") ES6 (2015) "symbol" 不可伪造的对象私有属性键、防冲突常量、语言内部迭代器扩展。
BigInt 100n, BigInt("...") ES2020 (2020) "bigint" 突破安全整数界限的高精大数、64位 ID、金融计息;严禁与 Number 隐式混算。
JavaScript基本数据类型有哪些:String、Number到BigInt完整列表
图 4:7 种基本数据类型全景特征与工程避坑准则对照总览

五、结语

至此,我们完整梳理了 JavaScript 中的 7 种基本数据类型(String、Number、Boolean、Undefined、Null、Symbol、BigInt)。在实际开发中,建立“基本类型按值传递且不可变、引用类型按引用传递且内部可变”的直观模型,并对 typeof null === "object"、NaN 的比较以及 BigInt 的类型隔离保持清晰认知,将能帮助你在面对数据流处理、状态管理与接口契约校验时游刃有余。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章