javascript基本类型赋值和传参是值传递,即复制值本身;对象类型是引用传递,即复制地址。基本类型存储在栈中,互不影响;对象存储在堆中,共享同一内存地址。

JavaScript 中基本数据类型(如 number、string、boolean、null、undefined、symbol、bigint)在赋值或函数传参时,是直接复制值本身,也就是所谓的“值传递”——这本质上就是一次内存中的值拷贝,但你不需要手动操作内存,引擎自动完成。
基本类型传值的本质是值拷贝
基本类型存储在栈内存中,每个变量拥有独立的存储空间。当把一个基本类型变量赋给另一个变量,或作为参数传入函数时,JS 引擎会把该值的副本写入新位置:
- 原始变量和新变量互不影响,修改其中一个不会影响另一个
- 这个过程对开发者完全透明,没有 API 或语法需要显式“深拷贝”或“浅拷贝”
- 例如:let a = 42; let b = a; → b 得到的是 42 的副本,不是指向 a 的引用
和对象类型传引用的关键区别
这点常被拿来对比理解:对象(包括数组、函数、普通对象等)是引用类型,变量保存的是指向堆内存中实际数据的地址。赋值时拷贝的是这个地址,而非数据本身:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- let obj1 = { x: 1 }; let obj2 = obj1; → obj2 和 obj1 指向同一块堆内存
- 而 let n1 = 100; let n2 = n1; → n2 是独立的数值,改 n2 不会影响 n1
- 这种差异决定了为什么基本类型天然“不可变”(重新赋值只是换了个值),而对象可原地修改
函数传参时的表现完全一致
函数接收基本类型参数时,形参获得的是实参值的拷贝,函数内部修改它不会影响外部变量:
- function foo(x) { x = x + 1; return x; } let a = 5; foo(a); // a 还是 5
- 即使在函数内重新赋值、甚至用 const 声明,也只作用于该拷贝,不波及原始值
- 这与 C 语言的“按值传递”语义一致,不是 JS 特有设计,而是由类型存储方式决定的
不需要也不支持手动内存控制
JavaScript 没有指针、没有 malloc、不能读写内存地址。所谓“内存拷贝”是 V8 等引擎底层行为,开发者只需理解语义:
- 不必调用 structuredClone 或展开运算符 —— 那些只对引用类型有意义
- 不要尝试用 Object.assign 或 JSON 方法去“深拷贝”数字或字符串 —— 它们本来就不需要
- 混淆基本/引用类型是常见 bug 来源,重点应放在区分“值相等”(===)和“引用相等”上
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










