JavaScript:函数:函数传参传的是什么?值传递还是引用传递?
2024-10-21 03:40:49
我们调用函数的时候,把实参放入到括号里进行传参,让形参接收实参的数据。
在这个过程中,形参接收的数据到底是什么,换句话说,我们传参传的到底是什么东西?
初学JS的,可能不太难理解这个问题的意义是什么?但是对于学过C/C++/Java的人来说,这个问题,其实就是在问,这个传参到底是值传递,还是引用传递。
首先,我们先理解值传递和引用传递的概念,这需要结合内存结构去理解:
我们知道,实参(即变量),它所保存的,是一个内存地址,而内存地所代表的这块内存,保存了一个数据;
看下面这个图:
变量b,所保存的是hello的内存地址,内存地址代表的那一块内存,保存了数据即字符串hello;
值传递
值,即这个数据。
所谓值传递,就是传递这个数据的一份copy。
我们对copy做任何操作,都不会影响到原始值。
引用传递
引用,即这个内存地址。
所谓引用传递,就是传递这个内存地址。
我们对内存地址做任何操作,实质上就是在对内存地址所代表的这块内存做操作,所以会影响到这块内存所保存的数据本身。
用两段代码来验证一下,JS的传参,到底传的是什么:
这里还要理解一个东西,即我们在查看或者说输出变量时,我们输出的是什么?肯定输出的是,变量所指向的那块内存保存的数据。
第一段代码,我们实参是基本数据类型,调用函数前后,实参输出结果没变,即实参指向的那块内存保存的数据没变;
第二段代码,我们实参是对象,调用函数前后,实参输出结果改变了,即实参指向的那块内存保存的数据被函数改变了;
所以,我们可以得出结论,传参的时候:
- 传基本数据类型时,是值传递;
- 传对象时,是引用传递;
最新文章
- display:none与visibility:hidden区别
- Android 软件开发之如何使用Eclipse Debug调试程序详解及Eclipse常用快捷键(转)
- javascript中数组concat()join()split()
- sencha touch 入门系列 (二)sencha touch 开发准备
- iOS8 UIAlertController弹出框中添加视图(例如日期选择器等等)
- mysql应用存储过程批量插入数据
- IOS中调整UI控件位置和尺寸
- 支持 IE8 IE11 和 FF, Chrome 浏览器的圆角
- Android GridView 二维布局界面
- javascript 常用函数
- docker入门【1】
- Java容器:Stack,Queue,PriorityQueue和BlockingQueue
- 【子集或者DFS】部分和问题
- 使用 Zabbix 监控 Jenkins
- 检查Rabbitmq中队列及消息个数,还有清空的方法
- android: ADB错误“more than one device and emulator”
- 设置pip的默认源
- Qt环境配置 + Qt使用教程
- Linux进程调度的运行队列
- 第七篇:Logistic回归分类算法原理分析与代码实现