JavaScript基本数据类型有哪些:从String到BigInt的完整清单
全面梳理JavaScript中现有的7大基本数据类型(String、Number、BigInt、Boolean、Undefined、Null、Symbol)。深入解析其内存特性、不可变性、底层存储、typeof陷阱以及BigInt解决超大整数精度的实战应用。
在 ECMAScript 规范中,JavaScript 的数据类型被划分为两大阵营:基本数据类型(Primitive Types,亦称原始数据类型)与引用数据类型(Reference Types,即 Object 及其派生类型)。截至目前的现代 JavaScript 标准,基本数据类型一共有 7 种:String、Number、BigInt、Boolean、Undefined、Null 和 Symbol。了解这 7 种类型的运行机制、内存分配以及类型检测细节,是写出健壮前端与 Node.js 程序的必要根基。
一、什么是基本数据类型:本质与内存机制
基本数据类型指的是非对象且没有方法的数据结构。与引用类型的核心差异在于:基本数据类型的值保存在栈内存(Stack)中,按值直接访问,且其内部数据具有“绝对不可变性(Immutability)”。
例如,当我们对一个字符串执行 str.toUpperCase() 或者字符串拼接时,并没有更改原始变量指向的字符串实体,而是在内存中开辟了一块新区域并返回了一个全新的字符串。同时,将基本类型变量赋值给新变量时,复制的是数值本身的独立副本,二者互不干扰。
二、从 String 到 BigInt:7 大基本数据类型逐项解析
1. String(字符串)
String 用于表示文本序列。在 JavaScript 中,字符串由一组 16 位的 Unicode 字符按照 UTF-16 编码组合而成。可以用单引号 ''、双引号 "" 或反引号 ``(模板字面量)定义。
const siteName = "JavaScript中文指南";
const greeting = `欢迎学习 ${siteName}!`;
// 验证不可变性:修改索引并不会生效,也不会报错(非严格模式)
let testStr = "hello";
testStr[0] = "H";
console.log(testStr); // 输出依然是 "hello"
日常需要注意的是:字符串具有类似数组的索引访问方式(如 str[0]),但由于它是基本类型且不可变,对其索引赋值没有任何作用。
2. Number(数字)
在 ES2020 之前,JavaScript 中所有的数值(包括整数与小数)都统一归属于 Number 类型。在规范底层,它遵循 IEEE 754 标准双精度 64 位二进制浮点数 规范存储。
- 有效安全整数范围:
-(2^53 - 1)至2^53 - 1(即-9007199254740991至9007199254740991),超出此范围进行整数运算将可能发生精度丢失。 - 特殊数值:包含
Infinity(正无穷)、-Infinity(负无穷)、+0与-0,以及非常特殊的NaN(Not-a-Number,代表非数字)。
// 浮点数经典问题
console.log(0.1 + 0.2 === 0.3); // false,实际计算结果为 0.30000000000000004
// NaN 的特性
console.log(typeof NaN); // "number"
console.log(NaN === NaN); // false,NaN 与包括自身在内的任何值都不相等
console.log(Number.isNaN(NaN)); // true (更安全的判断方式)
3. BigInt(大整数)
随着业务系统的复杂度提升,许多场景(如分布式系统中的雪花 ID Snowflake ID、高精度金融计费、区块链哈希等)所生成的数字常常超过 53 个二进制位。由于 Number 会发生溢出导致 ID 后几位被统一截断变成 0,ECMAScript 2020(ES11)正式引入了 BigInt 类型。
BigInt 允许在 JavaScript 中安全地表示和操作任意精度的整数。创建 BigInt 有两种方式:在整数末尾添加字母 n,或者调用 BigInt() 构造函数。
// 超过 Number.MAX_SAFE_INTEGER 时 Number 的失效
const max = Number.MAX_SAFE_INTEGER; // 9007199254740991
console.log(max + 1 === max + 2); // true! 产生计算 Bug
// 使用 BigInt 解决精度溢出
const big1 = 9007199254740991n;
console.log(big1 + 1n === big1 + 2n); // false! 得到精准结果
console.log(big1 + 2n); // 9007199254740993n
// 通过构造函数初始化
const bigFromStr = BigInt("90071992547409923849182391283");
注意:BigInt 不能直接与 Number 进行隐式算术运算(例如 1n + 1 会直接抛出 TypeError: Cannot mix BigInt and other types)。在需要互通时,必须明确通过 BigInt(num) 或 Number(bigint) 进行显式转换。此外,Math 对象的大多数方法(如 Math.max)不直接接收 BigInt。
4. Boolean(布尔值)
Boolean 只有两个字面量值:true 和 false。在条件控制语句(if、三元表达式等)或逻辑运算中,JavaScript 会将非布尔类型隐式转化为布尔值。
在 JavaScript 中,只有以下 8 个值 会被转化为 false(统称为 Falsy 虚值),其余所有值(包括空数组 []、空对象 {}、字符串 "false")在隐式转换时都为 true:
false0、-0、0n(BigInt 零值)""(空字符串)nullundefinedNaNdocument.all(历史遗留原因)
5. Undefined(未定义)
Undefined 类型只有一个单一值,即 undefined。它表示“缺少值”,通常出现在以下情况:
- 使用
let或var声明了变量,但未赋予初始值; - 函数没有显式返回值(或执行了不带参数的
return;); - 访问了对象上并不存在的属性;
- 函数调用时未传递对应的实参。
let score;
console.log(score); // undefined
function doNothing() {}
console.log(doNothing()); // undefined
const user = { name: "Alice" };
console.log(user.age); // undefined
6. Null(空值)
Null 类型也只有一个单一值,即 null。它在语义上表示“空对象指针”或“主动清空引用的意图”。与 undefined(系统层面的未知或未初始化)不同,null 通常由开发者在代码中主动赋值,用来指明该变量目前不指向任何对象实体,或者断开旧对象的内存引用以便垃圾回收器(GC)进行回收。
let currentSession = null; // 初始化为空对象,等待后续装载登录信息
// 清理引用
currentSession = null;
7. Symbol(符号值)
由 ECMAScript 2015(ES6)引入。每个从 Symbol() 函数返回的 symbol 值都是独一无二的。主要用于作为对象属性的唯一键,彻底杜绝属性命名冲突。
const symA = Symbol("id");
const symB = Symbol("id");
console.log(symA === symB); // false! 即使描述一致,内部标识也绝不相等
// 作为属性键
const student = {
[symA]: 1001,
name: "Bob"
};
// 常规的 Object.keys() 或 for...in 无法遍历到 Symbol 键,起到天然的弱隐藏作用
console.log(Object.keys(student)); // ["name"]
console.log(Object.getOwnPropertySymbols(student)); // [Symbol(id)]
三、基本数据类型的精准判断与排坑指南
在日常业务开发中,准确识别一个变量究竟是哪种基本数据类型至关重要。很多前端新手常在类型判断上遭遇隐蔽的 Bug。下面是常用判断方式与经典陷阱分析。
1. typeof 的作用与局限
typeof 是最常用的操作符,对于绝大多数原始类型表现良好,但存在两个著名的特例:
typeof "abc"; // "string"
typeof 123; // "number"
typeof 10n; // "bigint"
typeof true; // "boolean"
typeof undefined; // "undefined"
typeof Symbol(); // "symbol"
// ⚠️ 特例 1: typeof null
typeof null; // "object" !
// ⚠️ 特例 2: typeof function
typeof function(){};// "function" (规范特别规定,虽然它是 Object 派生)
为什么 typeof null === 'object'? 这是 JavaScript 最初版本实现中的一个历史遗留 Bug。在最初的 JS 实现中,值是以 32 位单元存储的,类型标签占据了低 1~3 位,其中 000 表示对象(Object)。而 null 的空指针表示恰好全为 0,因此类型标签也被判定为 000,从而输出了 "object"。由于修改此 Bug 会直接破坏大量现有网页的兼容性,因此这个特性被永久保留了下来。
2. 通用精准类型判断函数
为避免日常代码中散落各种条件分支与判断陷阱,在工程实践中常封装基于 Object.prototype.toString.call() 的工具函数:
function getExactType(val) {
// 处理 null 与 undefined 在不同环境下的字符串输出
if (val === null) return "null";
if (val === undefined) return "undefined";
// 通过内部 [[Class]] 标签精准获取类型
const tag = Object.prototype.toString.call(val); // 如 "[object BigInt]"
return tag.slice(8, -1).toLowerCase();
}
console.log(getExactType(100n)); // "bigint"
console.log(getExactType(null)); // "null"
console.log(getExactType(undefined)); // "undefined"
console.log(getExactType(Symbol("x")));// "symbol"
console.log(getExactType(/abc/g)); // "regexp" (引用类型亦能精确识别)
四、7 大基本数据类型全景特性速查与总结
为了让不同类型之间的差异、新增版本以及注意事项一目了然,下方的全景速查图与对比表格汇总了每一项基本数据类型的核心信息。
| 类型名称 | 引入标准 | 示例值 | typeof 返回值 | 主要应用场景 |
|---|---|---|---|---|
| String | ECMAScript 1 | "hello", `id_${count}` |
"string" |
文本展示、输入交互、数据序列化 |
| Number | ECMAScript 1 | 42, 3.14, NaN |
"number" |
一般算术、计数器、坐标与尺寸度量 |
| BigInt | ECMAScript 2020 | 9007199254740993n |
"bigint" |
高位订单号、雪花ID、加密学大数计算 |
| Boolean | ECMAScript 1 | true, false |
"boolean" |
逻辑开关、条件判断、过滤状态 |
| Undefined | ECMAScript 1 | undefined |
"undefined" |
未赋值变量占位、无返回值函数返回 |
| Null | ECMAScript 1 | null |
"object"(历史Bug) |
显式置空对象、释放内存引用 |
| Symbol | ECMAScript 2015 (ES6) | Symbol("token") |
"symbol" |
对象内部隐藏属性键、消除命名冲突、迭代器协议 |
五、总结
回顾全文,JavaScript 的数据类型体系从早期 ES1 时代的 5 大基本类型,经历了 ES6 引入 Symbol 解决对象键冲突,再到 ES2020 引入 BigInt 彻底突破 53 位浮点数的精度天花板,最终形成了当下的 7 种基本数据类型。
在日常编码中牢记以下三条黄金准则:
- 基本类型不可变:对字符串或数字的任何操作都在产生新值,原变量内容不可原地修改;
- 谨慎对待数值范围:只要涉及长整型 ID 或超大额度计算,坚决使用
BigInt并避免与Number隐式混算; - 看清 typeof 的边界:牢记
typeof null === 'object',在需要强类型检测时优先采用val === null或Object.prototype.toString.call()。
JS处理含Emoji或中文的字符串转数组乱码问题
2026-11-05 16:12:28
JS怎么使用展开运算符合并对象
2026-11-05 14:42:18
ES6+环境下判断JS对象为空的简洁写法
2026-11-05 12:12:23
怎么通过replacer函数自定义JS中JSON的格式化输出
2026-11-05 11:19:44
JS正则表达式基础:字面量与RegExp构造函数的区别及常用元字符
2026-11-05 11:16:58
相关标签:








