JavaScript有哪些数据类型:8种基本与引用类型清单

作者:异步漫步

时间:2026-10-30

浏览:532

详细梳理JavaScript最新的8种数据类型:7种基本原始类型(Number、String、Boolean、Undefined、Null、Symbol、BigInt)与1种引用类型(Object)。包含底层内存分配、行为差异、类型判断决策流及实用避坑指南。

文章目录
ECMAScript 标准体系与实战指南
在最新的 ECMAScript 规范中,JavaScript 共有 8 种内置数据类型。这 8 种类型在语言底层被划分为两大核心阵营:7 种基本数据类型(原始类型,Primitive Types)与 1 种引用数据类型(对象类型,Reference Type)。本文直接梳理这 8 种数据类型的完整清单、内存分配机制、差异对比及可靠的类型检测方案。

一、两大类别与内存模型总览

JavaScript 是动态弱类型语言,变量本身没有固定的类型限制,真正拥有类型的是变量当前所持有的值。为了管理运行期的数据,JavaScript 引擎将这 8 种类型按内存存储方式划分在两种不同的空间中:

  • 基本数据类型(7种):Number、String、Boolean、Undefined、Null、Symbol、BigInt。它们的值占用固定大小的内存,直接存储在栈内存(Stack)中,属于按值访问。
  • 引用数据类型(1种):Object(包括普通对象、Array、Function、Date、RegExp、Map、Set 等)。对象结构大小不固定,实体内容存储在堆内存(Heap)中,栈内存中仅保存一个指向堆内存实体的地址指针,属于按引用访问。
JavaScript有哪些数据类型:8种基本与引用类型清单
图 1:JavaScript 8 种数据类型分类体系与底层存储结构

二、7种基本数据类型(原始类型)详述

基本数据类型的值保存在栈内存中,本身具有不可变性(Immutability)。一旦创建,其值本身无法在原内存地址被修改,任何针对基本类型的算术或字符串拼接操作都会产生一个全新的值。

1. Number(数值)

JavaScript 不区分整型和浮点型,所有的常规数字均采用 IEEE 754 标准的双精度 64 位浮点数格式存储。这种存储方式决定了 Number 能够安全表示的整数范围在 -(2^53 - 1) 到 2^53 - 1 之间。

Number 类型还包含三个特殊的数值:

  • Infinity:正无穷大,例如非零数值除以 0 得到的结果。
  • -Infinity:负无穷大。
  • NaN(Not-a-Number):表示非合法数字运算结果(如 0 / 0 或 Number('abc'))。需要特别注意,NaN !== NaN 返回 true,必须使用 Number.isNaN() 进行可靠判断。
let score = 95;
let price = 19.99;
let overflow = 1 / 0; // Infinity
let invalid = Number("text"); // NaN

console.log(Number.isNaN(invalid)); // true

2. String(字符串)

String 用于表示文本数据,是由 16 位 Unicode 字符组成的不可变有序序列。支持单引号 ''、双引号 "" 以及 ES6 引入的反引号 ``(模板字符串)。

let single = 'hello';
let double = "world";
let template = `${single} ${double}!`; // 支持表达式插值

需要注意字符串的不可变性:调用 str.toUpperCase() 或 str.slice() 不会改变原字符串,而是返回一个全新的字符串。

3. Boolean(布尔值)

Boolean 仅有两个字面量值:true 和 false。它通常用于条件分支判断。在 JavaScript 的隐式类型转换中,以下 8 个值会被视为“假值”(Falsy),其余所有值均转换为 true:

  • false
  • 0、-0、0n(BigInt 零)
  • ""(空字符串)
  • null
  • undefined
  • NaN

4. Undefined(未定义)

Undefined 类型仅有一个值,即 undefined。它表示变量已经通过 let、var 或 const 声明,但尚未被赋予具体的值。此外,访问对象不存在的属性、未传参的函数形参,或者没有书写 return 语句的函数执行返回值,均为 undefined。

let username;
console.log(username); // 输出: undefined

function test() {}
console.log(test()); // 输出: undefined

5. Null(空值)

Null 类型也仅有一个值,即 null。它在语义上表示“故意设置为空的对象引用”。通常用作变量初始化的占位符,或者用于解除对象的引用以便垃圾回收。

重点提示:typeof null 的历史遗留 Bug

执行 typeof null 会返回 "object"。这是 JavaScript 最初版本为了性能用低位标签表示类型的历史设计遗留缺陷,并不代表 null 属于引用类型,null 在规范定义中是确凿的基本数据类型。

6. Symbol(符号 · ES6新增)

Symbol 是 ES6 引入的原语,通过 Symbol() 函数生成。每次调用 Symbol() 都会返回一个全局独一无二的值,即使传入相同的描述字符串也绝不相等。常用于为对象定义私有或唯一的属性名,防止属性在不同模块之间被意外覆盖。

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

const user = {
  [id1]: "10086",
  name: "张三"
};
console.log(user[id1]); // "10086"

7. BigInt(大整数 · ES2020新增)

BigInt 解决了 Number 类型超过安全整数范围(Number.MAX_SAFE_INTEGER 即 9007199254740991)后出现的精度丢失问题。可以通过在一个整数末尾加上小写字母 n,或者调用 BigInt() 构造。

const maxSafe = 9007199254740991;
console.log(maxSafe + 1 === maxSafe + 2); // true (Number 溢出导致精度丢失)

const big1 = 9007199254740991n;
console.log(big1 + 1n === big1 + 2n); // false (BigInt 精确运算)

注意:BigInt 与普通 Number 不能直接进行算术混合运算(例如 10n + 5 会抛出 TypeError),必须显式转换后才能计算。

三、1种引用数据类型(Object 及其衍生形态)

在 JavaScript 中,除上述 7 种基本类型外,其余所有复合实体都统称为 Object(对象)。Object 是一组键值对的集合,其键可以是 String 或 Symbol,值可以是任意数据类型。

以下常见的结构在底层规范上都是 Object 的子集或特化实现:

  • Array(数组):以整数为索引、有序存储数据的对象,具备 length 属性和内置数组操作方法。
  • Function(函数):拥有可执行代码块的特殊对象,能够作为一等公民在变量间传递。
  • Date、RegExp、Error:用于处理时间、正则表达式与异常的内置专有对象。
  • Map、Set、WeakMap、WeakSet:ES6 引入的集合型数据结构。

四、基本类型与引用类型的核心行为差异

基本类型与引用类型在赋值、传参和属性读写时表现出截然不同的行为模式:

JavaScript有哪些数据类型:8种基本与引用类型清单
图 2:基本类型与引用类型的赋值行为与内存变化对比
  • 按值传递与独立性:基本类型的复制是完整生成一个新副本,修改新变量绝不影响旧变量。
  • 按引用传递与共享性:引用类型的复制仅仅复制了指向堆内存实体的地址指针。因此通过一个变量修改对象属性,所有持有同一引用的变量都会感知到该变化。
  • 全等比较规则:两个基本类型比较(===)时比较的是具体数值是否相等;而两个对象比较时,即使内容完全相同(如 {} === {}),只要所指向的堆内存地址不同,结果依然是 false。

五、精准检测 8 种数据类型的决策方案

在开发过程中,准确判断变量类型是常见任务。由于历史兼容性原因,单一工具无法胜任所有场景,需要根据不同类型采用针对性的判断手段:

JavaScript有哪些数据类型:8种基本与引用类型清单
图 3:JavaScript 变量类型检测决策流程图

1. typeof 运算符

typeof 是最快捷的原生运算符,能够安全检测大部分基本数据类型以及函数。其返回值均为全小写的字符串:

typeof 42;          // "number"
typeof "abc";       // "string"
typeof true;        // "boolean"
typeof undefined;   // "undefined"
typeof Symbol();    // "symbol"
typeof 100n;        // "bigint"
typeof function(){};// "function" (函数特殊返回)

// 局限性:无法区分 null、数组及普通对象
typeof null;        // "object" (历史设计缺陷)
typeof [];          // "object"
typeof {};          // "object"

2. Array.isArray()

由于 typeof [] 返回 "object",不能直接识别数组。ES5 提供了专门的 Array.isArray() 方法,即使在多 iframe 嵌套的不同窗口执行环境中也能百分之百准确识别数组。

Array.isArray([]);          // true
Array.isArray({ length: 0 }); // false (类数组不是真数组)

3. Object.prototype.toString.call()(万能终极方案)

如果需要无视环境与类型差异,获取完全确定的类型名称,推荐调用 Object.prototype.toString.call(target)。该方法会借用 Object 顶层原型方法,返回格式为 [object Type] 的字符串:

const getType = (target) => {
  return Object.prototype.toString.call(target).slice(8, -1).toLowerCase();
};

console.log(getType(123));         // "number"
console.log(getType(null));        // "null"
console.log(getType(undefined));   // "undefined"
console.log(getType([]));          // "array"
console.log(getType({}));          // "object"
console.log(getType(new Date()));  // "date"
console.log(getType(/abc/));       // "regexp"
console.log(getType(new Map()));   // "map"

六、8种数据类型特征速查总结

最后,将 JavaScript 完整的 8 种数据类型及其核心特性、检测手段归纳为全景速览清单:

JavaScript有哪些数据类型:8种基本与引用类型清单
图 4:JavaScript 8 种数据类型全量特性速查与判定总结
类型名称 所属分类 典型字面量 / 构造示例 typeof 返回值 推荐检测方式
Number 基本数据类型 42, 3.14, NaN "number" typeof x === 'number'
String 基本数据类型 "hello", `hi ${name}` "string" typeof x === 'string'
Boolean 基本数据类型 true, false "boolean" typeof x === 'boolean'
Undefined 基本数据类型 undefined "undefined" typeof x === 'undefined'
Null 基本数据类型 null "object" (历史Bug) x === null
Symbol 基本数据类型 Symbol("desc") "symbol" typeof x === 'symbol'
BigInt 基本数据类型 9007199254740992n "bigint" typeof x === 'bigint'
Object 引用数据类型 {}, [], () => {} "object" / "function" Object.prototype.toString.call()

掌握这 8 种数据类型的划分标准与内存行为,不仅有助于在日常开发中写出类型安全的代码,更能从容应对深浅拷贝、原型链继承及复杂数据结构的比较操作。

实用工具推荐

电子包浆

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

使用 ›
图片压缩

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

使用 ›
相关文章