javascript共有8种数据类型,其中7种基本类型(string、number、boolean、null、undefined、symbol、bigint)按值存储于栈中,1种引用类型object(含array、function等)按引用存储,堆中存实际数据。

JavaScript 当前共有 8 种数据类型,其中 7 种是基本数据类型(primitive),1 种是引用类型(Object)。所谓“基本”,是指它们在内存中直接按值存储、不可变、赋值时发生拷贝。
7 种 primitive 类型速查
Number:整数、浮点数,也包括 NaN、Infinity 和 -Infinity。注意:typeof NaN 返回 "number"。
String:文本数据,支持单引号、双引号、反引号(模板字符串)。字符串本身不可变,但变量可重新赋值。
Boolean:只有两个值:true 和 false。常用于条件判断和逻辑运算。
undefined:变量声明但未赋值时的默认值;函数无返回时也隐式返回 undefined。
null:表示“有意为空”的原始值。虽然语义上代表空对象指针,但 typeof null 错误地返回 "object"(历史遗留 bug)。
Symbol:ES6 引入,每次调用 Symbol() 都生成唯一值,常用于对象属性键避免冲突,如 Symbol('id')。
BigInt:ES2020(即 ES10)引入,用于表示任意精度整数,必须以 n 结尾,如 123456789012345678901234567890n。不能与普通 Number 混合运算。
为什么不是 8 个 primitive?
很多人误以为 Object 的子类(如 Array、Function、Date、RegExp)是独立的基本类型,其实它们都属于 Object 这一引用类型。JS 规范中仅定义了上述 7 种 primitive 类型 + 1 种引用类型(Object),合计 8 种数据类型。
常见误区:
-
typeof []→"object" -
typeof function(){}→"function"(这是typeof的特例,但函数仍是 Object 的实例) -
typeof null→"object"(非设计本意,属规范缺陷)
primitive 类型的关键特征
它们全部存储在栈内存中,大小固定,访问快,复制时创建新值(值传递)。
判断是否为 primitive 的可靠方式:
- 用
typeof可识别除null外的所有 primitive - 结合
val !== null && typeof val === 'object'可排除null - 更稳妥的检测可用
Object.prototype.toString.call(val)(返回[object Type]格式)
容易混淆的边界情况
注意:以下看似“基础”但实际是对象包装器,不是 primitive:
-
new String("hello")→ object -
new Number(42)→ object -
new Boolean(true)→ object
它们会自动装箱/拆箱,但日常应始终使用字面量形式("hello"、42、true)以确保 primitive 行为。











