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,没变
-
n是x的独立副本,改n就像改一张照片的打印件,原底片不受影响 - 哪怕你在函数里重新赋值、加减、拼接,都只作用于这个局部拷贝
- 这种行为在
number、string、boolean、null、undefined、symbol上完全一致
为什么对象/数组能被“修改成功”?
因为传的是堆内存中对象地址的副本,形参和实参指向同一块内存区域:
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 反向代理 负载均衡 集群 部署指南
如何确认建站备案号应放置的具体位置?


