原始类型赋值开销极低,因其直接复制栈中固定长度值,不涉及内存分配、构造函数调用或垃圾回收,仅需一次寄存器位拷贝;而引用类型赋值虽快但仅为指针复制,后续访问需额外寻址。

原始类型的赋值开销极低,几乎可视为零成本操作。
为什么开销小?
原始类型(string、number、boolean、null、undefined、symbol、bigint)在赋值时,引擎直接复制栈中已有的固定长度值。整个过程不涉及内存分配、构造函数调用或垃圾回收,仅是一次寄存器或栈帧内的位拷贝。
- 数值如
42或true在栈中以 64 位浮点或 tagged pointer 形式存储,复制就是一次 CPU 寄存器搬运 - 短字符串(尤其字面量)常被引擎内部化(interned),相同内容共享地址;即使未内部化,V8 等引擎也会做哈希+长度快速比对,赋值仍不触发堆分配
- 没有原型链查找、无属性枚举、无引用计数,也不触发 GC
和引用类型赋值对比
引用类型赋值虽也快(只复制地址,通常 8 字节指针),但本质是“复制一个间接引用”,后续任何属性读写都需额外寻址跳转;而原始类型赋值后,变量即持有完整有效值,后续使用无需解引用。
-
let a = 123; let b = a;→b立刻拥有独立、可用的数值 -
let x = {n: 123}; let y = x;→y持有地址,访问y.n需先查堆、再取字段
实际影响场景
在高频逻辑中(如循环、渲染帧、事件处理器),原始类型赋值不会成为性能瓶颈,可放心使用。
立即学习“Java免费学习笔记(深入)”;
- 状态快照:
const prev = count;安全且无负担 - 参数传递:
fn(id)中id是 number/string,函数内重赋值不影响外部 - 避免误用包装对象:
new Number(42)赋值会触发堆分配,比42慢 5–10 倍
不复杂但容易忽略:真正拖慢性能的从来不是原始赋值本身,而是把它当成对象来用——比如给字符串加属性、反复装箱、或在循环里做 String(i) 拼接。


















