javascript函数参数如何传递_怎样理解值传递和引用传递?

发布时间 - 2026-01-07 00:00:00    点击率:
JavaScript函数参数均为值传递,即基本类型传值副本、对象传地址副本;修改对象属性会影响外部,但重赋值不会;应通过浅拷贝或返回新对象避免意外修改。

JavaScript 中所有函数参数都是值传递,没有真正的引用传递。 这句话不是绕口令,而是理解 JS 参数行为的关键前提。很多人看到 obj.name = 'Jerry' 能改外部对象,就以为是“引用传递”,其实只是传了一个地址的副本——它既不是纯值,也不是真引用,而是一种“传引用的副本”(pass by sharing)。

为什么基本类型修改不影响外部变量?

因为数字、字符串、布尔值等原始类型存储在栈中,传参时直接复制值本身:

function changeNum(n) {
  n = 100;
}
let x = 42;
changeNum(x);
console.log(x); // 42,没变
  • nx 的独立副本,改 n 就像改一张照片的打印件,原底片不受影响
  • 哪怕你在函数里重新赋值、加减、拼接,都只作用于这个局部拷贝
  • 这种行为在 numberstringbooleannullundefinedsymbol 上完全一致

为什么对象/数组能被“修改成功”?

因为传的是堆内存中对象地址的副本,形参和实参指向同一块内存区域:

function mutateObj(o) {
  o.age = 30;        // ✅ 修改属性:生效
  o = { name: 'Bob' }; // ❌ 重赋值:断开连接,不影响外部
}
let person = { name: 'Alice' };
mutateObj(person);
console.log(person.age); // 30
console.log(person.name); // 'Alice'(没变成 'Bob')
  • 第一行 o.age = 30 是通过地址找到原对象并写入,所以外部可见
  • 第二行 o = {...} 是让局部变量 o 指向新对象,原 person 变量仍指着旧地址
  • 这就像你和朋友共用一个云文档链接,你编辑内容大家都能看到;但如果你把链接改成另一个文档,朋友打开的还是原来的

常见踩坑场景与应对建议

实际开发中,最容易栽跟头的地方不是“能不能改”,而是“什么时候意外改了”:

立即学习“Java免费学习笔记(深入)”;

  • Array.prototype.push().pop().splice() 等方法操作传入的数组,会直接污染原始数组——除非你明确想这样,否则应先 [...arr]arr.slice() 浅拷贝
  • 用解构赋值 { name } = obj 拿出属性后修改,不会影响 obj;但若解构后又执行 obj.name = 'xxx',就又回到共享地址的老问题
  • 函数返回新对象(如 return { ...obj, age: newAge })比原地修改更安全,尤其在 React/Vue 的响应式逻辑中,避免触发不必要的更新
  • 调试时别只看 console.log 的输出——用 === 判断两个变量是否指向同一对象,比“看起来一样”更可靠

真正容易被忽略的,不是“对象能被改”,而是“改的是谁的副本”。只要记住:JS 里没有魔法,只有栈里的地址拷贝 + 堆里的真实数据。传什么,就只能动什么;想不动原数据,就得自己做拷贝。


# vue  # react  # javascript  # java  # js  #   # 为什么 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: iOS中将个别页面强制横屏其他页面竖屏  jquery插件bootstrapValidator表单验证详解  如何用y主机助手快速搭建网站?  如何在自有机房高效搭建专业网站?  详解jQuery中基本的动画方法  魔毅自助建站系统:模板定制与SEO优化一键生成指南  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel如何与Pusher实现实时通信?(WebSocket示例)  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权  如何在IIS中配置站点IP、端口及主机头?  iOS发送验证码倒计时应用  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何在建站宝盒中设置产品搜索功能?  laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  昵图网官网入口 昵图网素材平台官方入口  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  浅谈javascript alert和confirm的美化  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何处理文件下载请求?(Response示例)  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何在服务器上配置二级域名建站?  Laravel如何实现API速率限制?(Rate Limiting教程)  Linux安全能力提升路径_长期防护思维说明【指导】  微信小程序 配置文件详细介绍  如何做网站制作流程,*游戏网站怎么搭建?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  Python文件操作最佳实践_稳定性说明【指导】  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  如何用5美元大硬盘VPS安全高效搭建个人网站?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  linux top下的 minerd 木马清除方法  Laravel怎么使用artisan命令缓存配置和视图  浅谈redis在项目中的应用  javascript如何操作浏览器历史记录_怎样实现无刷新导航  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  如何确认建站备案号应放置的具体位置?