js中的函数是按值传递还是按引用传递

文章目录


前置知识

如果关于js中普通类型和引用类型这两种类型的变量在赋值时存在的不同的同学,可以看看下面链接给出的博客。

js中关于普通类型的赋值和引用类型的赋值


结论

js中的函数是按值传递的,不是按引用传递。

原因解析

函数参数传递------基本类型

首先给大家看一段js代码:

js 复制代码
function f(n) {
  n = 2;
  console.log(n);//2
}
var num = 1;
console.log(num);//1
f(num);
console.log(num);//1

在将外部的基本类型变量num传入函数之后,就算对函数内的命名参数(局部变量)的数值修改,外部的变量num的数值并未变化(之前是1,函数内局部变量修改成2,外部的它还是1)

如果是按引用传递,外部变量num自然会受到函数赋值的影响,变成2。

函数参数传递------引用类型

js 复制代码
function f(obj) {
  obj.num = 2;
  console.log(obj);//2
}
var obj = {num:1};
console.log(obj);//{num: 1}
f(obj);
console.log(obj);//{num: 2}

从这里可以看到,函数内部对对象属性值的修改影响到了外部的对应对象。有些人其实是按照这个来认为函数参数的传递是按引用传递的,但这其实是错的,它其实还是值的传递

为了说明方便,将上文的函数参数名称改为:obj_

如果是按照函数参数按照引用传递,那么上述代码的关系应该是这样的:

那么真的是这样的吗,如果是这样,我对将一个新的对象赋值给obj_ ,obj对应的对象也应该发生改变。

执行代码如下(如有怀疑可以自行打开控制台验证):

js 复制代码
function f(obj_) {
  obj_.num = 2;
  console.log(obj_);//2
  obj_ = { num: 23333 }
  console.log(obj_);//{num: 23333}
}
var obj = { num: 1 };
console.log(obj);//{num: 1}
f(obj);
console.log(obj);//{num: 2}

执行结果:

结果很显而易见,将新的对象赋值给函数内部的变量,这一结果并没有让变量obj的数值改变。

它们的关系应该是这样的:

外部的obj将其保存的对象地址的引用,函数参数同样保存这一对象地址的引用,二者指向了同一个对象。上文的代码结果,是按值传递应该产生的结果。


至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!

相关推荐
小林ixn6 分钟前
从 onclick 到 React 合成事件,再到完整应用逻辑:一次前端架构的深度剖析
前端·react.js·前端框架
Csvn43 分钟前
🧩「找不到模块」排查全记录——Monorepo 下 TypeScript 路径别名的 5 种「不通」与根治方案
前端
腻害兔1 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
SeaTunnel1 小时前
从 Python Script 地狱到标准化数据集成框架
大数据·开发语言·python·程序员·代码·seatunnel
CodexDave1 小时前
MySQL事务隔离级别与MVCC机制解析
前端·数据库·mysql·nginx·性能优化·负载均衡
碎光拾影1 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Marst Code2 小时前
(python)2026Plotly 库评估:交互式可视化到底值不值得引入?
开发语言·python
Ai_easygo2 小时前
AI Agent开发入门——从ReAct到Tool Calling,拆解Agent的底层运行逻辑
前端·人工智能·react.js
研☆香2 小时前
分析制作html页面,如何划分页面结构
前端
Miao121312 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言