JavaScript 引用数据类型

在 JavaScript 中,数据类型分为基本类型(原始类型)和引用类型(对象类型)。引用数据类型的特点是其值存储在堆内存中,变量存储的是指向该内存地址的引用(指针)。当复制引用类型变量时,复制的只是引用地址,而非实际数据。

主要引用数据类型
  1. 对象(Object)

    • 键值对集合:{ key: value }
    • 创建方式:
      let obj = { name: "Alice", age: 30 };
      let obj2 = new Object();  // 构造函数
      

  2. 数组(Array)

    • 有序数据集合:[item1, item2]
    • 创建方式:
      let arr = [1, "text", true];
      let arr2 = new Array(5);  // 长度为5的空数组
      

  3. 函数(Function)

    • 可执行代码块
    • 创建方式:
      function sum(a, b) { return a + b; }
      let multiply = new Function('a', 'b', 'return a * b');
      

  4. 日期(Date)

    • 时间日期对象
    let now = new Date();  // 当前时间
    

  5. 正则表达式(RegExp)

    • 模式匹配工具
    let regex = /ab+c/i;  // 忽略大小写的匹配
    

核心特性
  1. 引用传递

    let arr1 = [1, 2, 3];
    let arr2 = arr1;      // 复制引用地址
    arr2.push(4);         // 修改会影响原数据
    console.log(arr1);    // 输出 [1, 2, 3, 4]
    

  2. 动态属性

    let obj = {};
    obj.newKey = "动态添加属性";  // 运行时修改
    

  3. 比较行为

    let a = { value: 10 };
    let b = { value: 10 };
    console.log(a === b);  // false (比较引用地址)
    

内存模型
栈内存       堆内存
┌──────┐     ┌────────────┐
│ 变量 │───→│ 对象实际数据 │
└──────┘     └────────────┘

重要操作
  1. 浅拷贝(复制第一层)

    let original = { a: 1, b: { c: 2 } };
    let shallowCopy = { ...original };  // 展开运算符
    

  2. 深拷贝(完全独立副本)

    let deepCopy = JSON.parse(JSON.stringify(original));
    

  3. 类型检测

    console.log(typeof []);        // "object"
    console.log(Array.isArray([])); // true
    console.log({} instanceof Object); // true
    

注意事项
  1. 引用类型变量在函数参数中按引用传递

    function modify(obj) {
      obj.key = "changed";
    }
    let test = {};
    modify(test);
    console.log(test.key);  // "changed"
    

  2. 循环引用会导致内存泄漏

    let objA = {};
    let objB = { ref: objA };
    objA.ref = objB;  // 循环引用
    

  3. 使用 const 声明时:

    const arr = [1, 2];
    arr.push(3);     // 允许(修改堆数据)
    arr = [4, 5];    // 报错(禁止修改引用地址)
    

理解引用数据类型对掌握 JavaScript 的内存管理、函数传参和数据操作至关重要。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐