JavaScript所有参数均按值传递:基本类型传值副本,修改不影响原变量;引用类型传地址副本,属性修改影响原对象,但重新赋值会切断绑定。

JavaScript 中没有真正意义上的“按址传递”,所有参数都是按值传递的。所谓“基本类型按值、引用类型按址”,其实是对底层行为的一种简化描述,本质区别在于:传的是值本身,还是指向堆内存对象的地址值。
基本类型:传的是值的副本
数字、字符串、布尔值、undefined、null、symbol、bigint 这些基本类型,变量直接存储值,位于栈内存中。函数传参或变量赋值时,会把该值完整复制一份给新变量。
- 修改形参不会影响实参,因为两者是完全独立的内存空间
- 例如:let a = 5; function f(x) { x = 10; } f(a); console.log(a); // 仍为 5
引用类型:传的是地址值的副本
对象、数组、函数、Map、Set 等引用类型,变量在栈中存的不是数据本身,而是指向堆内存中实际对象的地址。传参或赋值时,复制的是这个地址值(即“指针副本”),而非对象内容。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 通过形参修改对象属性(如 obj.name = 'x')会影响外部,因为地址相同,操作的是同一块堆内存
- 但若在函数内让形参重新赋值(如 obj = {}),只改变了副本地址,不影响外部变量的指向
- 例如:let arr = [1]; function g(a) { a.push(2); a = [3]; } g(arr); console.log(arr); // [1, 2]
判断依据:看是否改变变量的绑定关系
关键不在类型,而在操作行为——只要没对形参执行 = 赋值操作,它就始终指向原对象;一旦执行了 =,就切断了与原始堆内存的联系。
立即学习“Java免费学习笔记(深入)”;
- 属性修改(obj.x = 1)、方法调用(arr.push())、解构赋值等,都不改变绑定
- 直接赋值(obj = {...})、return 新对象、let/const 重声明等,都会创建新绑定
验证方式:用 === 比较和内存视角理解
两个变量是否相等(===),基本类型比值,引用类型比地址。同一个对象被多个变量持有时,它们的 === 结果为 true;不同对象即使结构相同,也是 false。
- let a = {}; let b = a; console.log(a === b); // true
- let c = {}; let d = {}; console.log(c === d); // false
- 这说明:变量保存的确实是“可比较的地址值”,不是抽象的“引用概念”

















