JavaScript基本数据类型有哪些:7种原始类型完整清单

作者:木棉时间:2026-10-30 19:01:18浏览:475

全面梳理 JavaScript 中的 7 种原始数据类型(Number、String、Boolean、Undefined、Null、Symbol、BigInt),深入解析其内存存储机制、值不可变性、类型检测方法与常见避坑要点。

在目前的 ECMAScript 规范标准中,JavaScript 的数据类型被划分为两大阵营:原始数据类型(Primitive Types)与引用数据类型(Object)。其中,原始类型共有 7 种:Number、String、Boolean、Undefined、Null、Symbol 和 BigInt。这 7 种类型直接存储于栈内存中,具有不可变性,按值访问与比对。

JavaScript基本数据类型有哪些:7种原始类型完整清单
图 1:JavaScript 7 种原始数据类型(Primitive Types)全景清单与核心技术特征

一、深入认识 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 个:

  • false
  • 0、-0、0n(BigInt 零)
  • ""(空字符串)
  • null
  • undefined
  • NaN
  • document.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)。

JavaScript基本数据类型有哪些:7种原始类型完整清单
图 2:原始类型与引用类型在栈堆内存分配、变量赋值机制上的底层差异对比
核心技术认知:包装对象(Primitive Wrapper Objects)与自动装箱机制
既然原始数据类型不是对象,为什么我们能够直接对字符串或数字执行 "hello".toUpperCase() 或 (123.45).toFixed(1)?
这是因为 JavaScript 具备自动装箱(Autoboxing)机制。当尝试访问原始值的属性或方法时,引擎会在后台瞬间创建一个对应的临时包装对象(如 new String() 或 new Number()),在该对象上执行方法调用并返回结果,随后立即销毁该临时对象。因此,原始类型仍然是不可变的,其本身并没有固化任何对象属性。

三、精准检测 7 种原始类型的步骤与决策流程

在日常开发与工具库编写中,精准识别变量到底属于哪一种原始类型,是避免线上运行时崩溃(例如 TypeError: Cannot read properties of null / undefined)的关键基本功。

JavaScript基本数据类型有哪些:7种原始类型完整清单
图 3:JavaScript 变量精准检测与 7 种原始类型推导决策步骤流程图

代码实战:封装工业级的精准类型检测工具函数

基于上述推导流程,我们可以编写一个能够覆盖全部 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 语言内建的最常用类型查询一元运算符。虽然它使用便捷,但在实际工程中隐藏着数个需要格外留神的特例与语言设计包袱。

JavaScript基本数据类型有哪些:7种原始类型完整清单
图 4:typeof 运算符执行矩阵、历史二进制缺陷与新型原始类型使用边界

五、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 数据类型的清晰框架:

  1. 牢记 7 种原始类型:Number、String、Boolean、Undefined、Null、Symbol、BigInt。除这 7 种原始类型外,JavaScript 中其余的一切结构(普通对象、数组、函数、Map、Set、Date、RegExp、Promise 等)全属于引用类型(Object)。
  2. 原始类型的核心铁律:存储于栈内存中,空间开销固定且随栈帧自动释放;值本身具备严格的不可变性(Immutability);变量传递与比对均按实际字面值独立进行。
  3. 防御意识与检测准则:检测常规类型首选 typeof;排查空引用使用 === null;深度鉴别复杂引用对象使用 Object.prototype.toString.call();处理数值计算必须养成使用 Number.isNaN() 与 Number.isSafeInteger() 检验边界的良好编码习惯。
作者最新文章
相关文章
更多