全面梳理 JavaScript 中的 7 种原始数据类型(Number、String、Boolean、Undefined、Null、Symbol、BigInt),深入解析其内存存储机制、值不可变性、类型检测方法与常见避坑要点。
JavaScript基本数据类型有哪些:7种原始类型完整清单
时间:2026-10-30
浏览:474
文章目录
在目前的 ECMAScript 规范标准中,JavaScript 的数据类型被划分为两大阵营:原始数据类型(Primitive Types)与引用数据类型(Object)。其中,原始类型共有 7 种:Number、String、Boolean、Undefined、Null、Symbol 和 BigInt。这 7 种类型直接存储于栈内存中,具有不可变性,按值访问与比对。
一、深入认识 7 种原始数据类型
JavaScript 是一种弱类型、动态类型的脚本语言。在变量声明阶段,变量本身不带有类型信息,只有具体的值(Value)才拥有确定的数据类型。当值属于以下 7 种类型之一时,它就是标准的原始值(Primitive Value)。
1. Number(数值类型)
JavaScript 不像 C、Java 或 Go 那样区分 int、float 或 double。在 JavaScript 中,所有的常规数值统一采用 Number 类型表示。根据 IEEE 754 标准,其实质是双精度 64 位二进制浮点数(Double Precision Floating-Point)。
由于浮点数存储规范的限制,Number 类型具备以下关键边界:
- 安全整数范围:能够被精确表示且不发生精度丢失的整数范围是
-(2^53 - 1)到(2^53 - 1),即Number.MIN_SAFE_INTEGER(-9007199254740991)到Number.MAX_SAFE_INTEGER(9007199254740991)。超出该范围时,整数运算可能会出现舍入误差。 - 0.1 + 0.2 !== 0.3 问题:在浮点数二进制转换中,十进制小数 0.1 和 0.2 转换为无限循环二进制小数,存储截断后相加得到
0.30000000000000004。 - 特殊数值:
NaN(Not-a-Number):表示无效的算术计算结果。需要特别注意:NaN === NaN返回false,检测一个值是否为 NaN 应当使用Number.isNaN()。Infinity与-Infinity:表示超出上限的无穷大值(例如1 / 0)。+0与-0:两者在全等比对(+0 === -0)下返回 true,但在除法中表现不同(1 / +0 === Infinity,而1 / -0 === -Infinity)。可通过Object.is(+0, -0)精确识别。
2. String(字符串类型)
String 用于表示文本数据。它是一组由 16 位无符号整数值(UTF-16 代码单元)组成的有序序列。每个字符在字符串中占据一个基于 0 的索引位置,字符串的长度即为其包含的代码单元数量。
字符串的核心特性是不可变性(Immutability)。一旦创建,其内部内容永远无法被直接改变:
let text = "hello";
text[0] = "H"; // 严格模式下报错,非严格模式下静默失效
console.log(text); // 依然输出 "hello"
let upper = text.toUpperCase(); // 返回全新的字符串副本
console.log(upper); // 输出 "HELLO"
console.log(text); // 原字符串保持不变
现代 JavaScript 支持三种字符串字面量声明方式:单引号('...')、双引号("...")以及 ES6 引入的反引号模板字面量(`...`)。模板字面量支持多行文本与 ${expression} 语法插值。
3. Boolean(布尔类型)
Boolean 是最简单的一种原始数据类型,仅有两个逻辑字面量:true 和 false。它常用于流程控制语句(如 if、while、三元运算符)的条件判断分支。
在 JavaScript 的类型隐式转换中,所有的值在转换为布尔值时均遵循明确的规则。其中,假值(Falsy Values)清单只有确定的 8 个:
false0、-0、0n(BigInt 零)""(空字符串)nullundefinedNaNdocument.all(老旧浏览器遗留对象,在现代标准中作为假值处理)
除以上假值之外,JavaScript 中的其他所有值(包括空对象 {}、空数组 []、字符串 "0"、字符串 "false" 等)在转换为布尔值时全部为 真值(Truthy)。
4. Undefined(未定义类型)
Undefined 类型只有一个唯一的值,即 undefined。它在语义上表示“变量已被声明,但尚未被赋予具体的值”,或者是“缺少应有的值”。
以下场景会自动产生 undefined:
- 使用
let或var声明变量但未初始化(例如let count;)。 - 函数没有显式编写
return语句,或编写了空的return;,此时执行该函数默认返回undefined。 - 访问对象上一个尚未定义的属性(例如
const user = {}; console.log(user.age);)。 - 调用函数时,未传递形参对应的实参。
5. Null(空值类型)
Null 类型同样仅包含一个字面量:null。它在语义上表示“刻意指定为空的对象指针”,即该变量明确不指向任何内存中的对象实体。
许多初学者容易混淆 undefined 与 null 的边界:
undefined代表系统级、未初始化的“缺省状态”。null代表程序逻辑主动赋值的“空引用状态”,常用于重置变量、断开引用以配合垃圾回收。- 在原型链终点,
Object.prototype.__proto__的值固定为null,表示原型链检索的彻底终结。
6. Symbol(符号类型)
Symbol 是 ECMAScript 2015(ES6)引入的原始数据类型。其核心设计初衷是提供一种全局独一无二、不可伪造的标识符,主要用于充当对象属性键名,彻底解决多模块协作或库开发中可能出现的“属性命名冲突”问题。
// 每次调用 Symbol() 创建的值均全局唯一
const id1 = Symbol("userId");
const id2 = Symbol("userId");
console.log(id1 === id2); // false
// 作为对象的计算属性名
const user = {
name: "Alice",
[id1]: 1001
};
// 普通遍历无法获取 Symbol 属性
console.log(Object.keys(user)); // ["name"]
console.log(Object.getOwnPropertySymbols(user)); // [Symbol(userId)]
创建 Symbol 时直接调用 Symbol() 函数,严禁使用 new Symbol(),因为它是原始数据类型而非构造函数对象。
7. BigInt(大整数类型)
BigInt 是 ECMAScript 2020(ES11)正式加入的原始数据类型。它的出现弥补了 Number 类型在超过 2^53 - 1 时无法安全存储与计算大整数的技术短板。
在涉及数据库 64 位雪花算法 ID、高精度时间戳、区块链金融账本等业务场景中,由于数值往往高达 18~19 位十进制数字,直接使用 Number 会发生末位精度篡改,而 BigInt 能够提供任意精度的整数运算支持:
// 声明方式:数字末尾添加 n,或调用 BigInt() 构造函数
const maxSafe = 9007199254740991n;
const nextVal = maxSafe + 1n; // 9007199254740992n,精度分毫不差
// 注意:BigInt 无法与常规 Number 隐式混合运算
// const invalid = 10n + 5; // 抛出 TypeError: Cannot mix BigInt and other types
const valid = 10n + BigInt(5); // 15n
二、原始类型与引用类型在内存中的本质区别
理解这 7 种原始类型,核心在于理解它们在 JavaScript 执行引擎中的底层内存模型。JavaScript 的运行时内存主要划分为调用栈(Call Stack)与堆内存(Heap Memory)。
既然原始数据类型不是对象,为什么我们能够直接对字符串或数字执行
"hello".toUpperCase() 或 (123.45).toFixed(1)?这是因为 JavaScript 具备自动装箱(Autoboxing)机制。当尝试访问原始值的属性或方法时,引擎会在后台瞬间创建一个对应的临时包装对象(如
new String() 或 new Number()),在该对象上执行方法调用并返回结果,随后立即销毁该临时对象。因此,原始类型仍然是不可变的,其本身并没有固化任何对象属性。
三、精准检测 7 种原始类型的步骤与决策流程
在日常开发与工具库编写中,精准识别变量到底属于哪一种原始类型,是避免线上运行时崩溃(例如 TypeError: Cannot read properties of null / undefined)的关键基本功。
代码实战:封装工业级的精准类型检测工具函数
基于上述推导流程,我们可以编写一个能够覆盖全部 7 种原始类型与复杂引用对象的通用检测函数:
/**
* 获取变量的精准数据类型
* @param {*} value
* @returns {string} 返回全小写的类型名称(如 number, string, null, bigint 等)
*/
function getExactType(value) {
// 1. 特别优先处理 null,规避历史 typeof null === 'object' 的 Bug
if (value === null) {
return "null";
}
// 2. 对于其他原始类型及函数,typeof 能够给出直接且极高效的判定
const baseType = typeof value;
if (baseType !== "object") {
return baseType; // "undefined", "boolean", "number", "string", "symbol", "bigint", "function"
}
// 3. 针对引用对象,使用 Object.prototype.toString 获取规范内部 [[Class]] 标签
// 例如 "[object Array]" -> 提取出 "array"
return Object.prototype.toString
.call(value)
.slice(8, -1)
.toLowerCase(); // "array", "date", "regexp", "map", "set", "object" 等
}
// 测试结果:
console.log(getExactType("Ku-AiFram")); // "string"
console.log(getExactType(1001)); // "number"
console.log(getExactType(1001n)); // "bigint"
console.log(getExactType(Symbol("key"))); // "symbol"
console.log(getExactType(undefined)); // "undefined"
console.log(getExactType(null)); // "null"
console.log(getExactType([])); // "array"
console.log(getExactType({})); // "object"
四、typeof 运算符行为矩阵与 4 大高频陷阱
typeof 是 JavaScript 语言内建的最常用类型查询一元运算符。虽然它使用便捷,但在实际工程中隐藏着数个需要格外留神的特例与语言设计包袱。
五、7 种原始数据类型全景特性速查表
为了便于在日常业务开发与技术面试中快速查阅,以下将这 7 种原始数据类型的所有关键技术维度整理为一份完整的对照清单:
| 原始类型 | 规范引入版本 | 典型字面量示例 | typeof 返回值 | 主要应用场景与注意事项 |
|---|---|---|---|---|
| Number | ECMAScript 1 (ES1) | 42, 3.14, NaN, Infinity |
"number" |
常规算术计算。注意 NaN !== NaN 以及浮点数精度截断问题。 |
| String | ECMAScript 1 (ES1) | "hello", 'js', `Hi ${x}` |
"string" |
文本展示与处理。UTF-16 编码,字符序列绝对只读不可变。 |
| Boolean | ECMAScript 1 (ES1) | true, false |
"boolean" |
条件控制流。牢记常见 8 种 Falsy 假值,其余值皆为真。 |
| Undefined | ECMAScript 1 (ES1) | undefined |
"undefined" |
系统默认缺省值。变量已声明未赋值、函数无返回值或访问缺失属性。 |
| Null | ECMAScript 1 (ES1) | null |
"object" (历史缺陷) |
主动设为空的对象指针。原型链终点。检测需使用严格全等 v === null。 |
| Symbol | ECMAScript 2015 (ES6) | Symbol("token") |
"symbol" |
独一无二的对象属性键。不可通过 new 创建,不参与普通对象迭代。 |
| BigInt | ECMAScript 2020 (ES11) | 9007199254740992n |
"bigint" |
超出安全整数范围的大整数计算。不能与 Number 发生隐式混合运算。 |
六、全文总结
回顾本文的核心梳理,我们可以得出关于 JavaScript 数据类型的清晰框架:
- 牢记 7 种原始类型:Number、String、Boolean、Undefined、Null、Symbol、BigInt。除这 7 种原始类型外,JavaScript 中其余的一切结构(普通对象、数组、函数、Map、Set、Date、RegExp、Promise 等)全属于引用类型(Object)。
- 原始类型的核心铁律:存储于栈内存中,空间开销固定且随栈帧自动释放;值本身具备严格的不可变性(Immutability);变量传递与比对均按实际字面值独立进行。
- 防御意识与检测准则:检测常规类型首选
typeof;排查空引用使用=== null;深度鉴别复杂引用对象使用Object.prototype.toString.call();处理数值计算必须养成使用Number.isNaN()与Number.isSafeInteger()检验边界的良好编码习惯。
实用工具推荐
绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
选择画质和输出格式,预览压缩前后的大小。