管理

一、JavaScript数据类型的核心分类

JavaScript的数据类型分为值类型(基本类型)引用类型(复杂类型),它们的存储方式、操作逻辑及内存管理机制截然不同,深刻理解二者差异是优化代码性能和避免Bug的关键。

1. 值类型(Primitive Types)

  • 特点:按值访问,直接存储在栈内存中,赋值时复制值本身,修改互不影响。
  • 具体类型
    • Undefined:变量未赋值的默认状态(如 let a;)。
    • Null:明确赋值的空值,常用于释放对象引用。
    • BooleanNumberString:布尔值、数字(含浮点数)和不可变字符串。
    • Symbol(ES6):唯一标识符,用于对象属性键。

2. 引用类型(Reference Types)

  • 特点:按引用访问,数据存储在堆内存中,变量仅保存内存地址的引用,赋值时共享同一对象。
  • 常见类型
    • Object:键值对集合(如 {name: 'John'})。
    • ArrayFunctionDateRegExp等。

二、内存存储机制:栈与堆的较量

1. 值类型的栈内存存储

  • 存储方式:直接存储值本身,内存分配高效且固定。
  • 示例
    let a = 10;
    let b = a;  // 复制值,a和b独立
    b = 20;
    console.log(a); // 10(不受影响)

2. 引用类型的堆内存存储

  • 存储方式:变量在栈中存储对象的堆内存地址,实际数据在堆中动态分配。
  • 示例
    let obj1 = { value: 10 };
    let obj2 = obj1;  // 复制引用地址,指向同一对象
    obj1.value = 20;
    console.log(obj2.value); // 20(同步修改)
  • 内存泄漏风险:若未手动释放或依赖垃圾回收机制,可能造成堆内存堆积。

三、函数参数传递的底层逻辑

1. 值类型参数传递

  • 行为:传递值的副本,函数内修改不影响外部变量。
    function modify(num) {
      num = 100;
    }
    let x = 10;
    modify(x);
    console.log(x); // 10

2. 引用类型参数传递

  • 行为:传递内存地址的引用,函数内修改会同步到外部对象。
    function update(obj) {
      obj.name = "Lucy";
    }
    let person = { name: "John" };
    update(person);
    console.log(person.name); // "Lucy"
Copyright © 2000-2022 Lzhdim Technology Software All Rights Reserved