[1-1] 数据类型 · 基本类型与引用类型、栈堆内存

12 阅读2分钟

所属板块:1. 数据类型与内存机制

记录日期:2026-03-04
更新:持续补充示例

1. JavaScript 的数据类型分类

JS 当前(2026)有 8 种数据类型

基本(原始)类型(7种,按值存储,不可变):

  • undefined
  • null
  • boolean
  • number
  • string
  • symbol(ES6,用于唯一键)
  • bigint(ES2020+,处理大整数,避免精度丢失)

引用类型(统称为 Object):

  • Object(普通对象)
  • Array、Function、Date、RegExp、Map、Set、WeakMap、WeakSet 等都是 Object 的子类型

记住:基本类型存值,引用类型存地址(指针)。

2. 栈内存与堆内存的区别

方面栈(Stack)堆(Heap)
存储内容基本类型 + 引用类型的地址引用类型实际对象内容
空间大小较小、固定较大、可动态分配
访问方式按值访问按引用(地址)访问
分配方式自动分配与释放需要垃圾回收机制
生命周期函数执行完自动弹出对象不再被引用时才可能回收

示例:

let a = 100;          // 栈中存 100
let b = a;            // 复制值,b 也存 100,独立

let obj = { x: 1 };   // 栈中存地址(指向堆),堆中存 {x:1}
let obj2 = obj;       // 复制地址,obj 和 obj2 指向同一对象
obj2.x = 999;
console.log(obj.x);   // 999(共享同一对象)

3. 常见注意点

  • 基本类型的值不可变:

    let str = "hello";
    str[0] = "H";          // 无效
    console.log(str);      // 仍然 "hello"
    
  • null 和 undefined 的区别(面试常问):

    • null:人为设置的“空对象指针”
    • undefined:未定义、未初始化
  • Symbol 和 BigInt 的简单使用场景:

    • Symbol:作为对象唯一属性键,避免覆盖

      const key = Symbol("id");
      obj[key] = 123;  // 不会和字符串 "id" 冲突
      
    • BigInt:处理超过 Number.MAX_SAFE_INTEGER 的整数

      const big = 12345678901234567890n;
      console.log(big + 1n);   // 正确计算
      

4. 为什么要把引用类型放在堆里?

因为对象大小不确定、需要动态扩展,栈不适合。栈只适合固定大小、频繁存取的数据。

下一篇文章会继续记录类型检测的几种方法(typeof 的坑、toString.call 的用法等)。

返回总目录:戳这里