我们调用函数的时候,把实参放入到括号里进行传参,让形参接收实参的数据。

在这个过程中,形参接收的数据到底是什么,换句话说,我们传参传的到底是什么东西?

初学JS的,可能不太难理解这个问题的意义是什么?但是对于学过C/C++/Java的人来说,这个问题,其实就是在问,这个传参到底是值传递,还是引用传递。

首先,我们先理解值传递和引用传递的概念,这需要结合内存结构去理解:

我们知道,实参(即变量),它所保存的,是一个内存地址,而内存地所代表的这块内存,保存了一个数据;

看下面这个图:

变量b,所保存的是hello的内存地址,内存地址代表的那一块内存,保存了数据即字符串hello;

  • 值传递

    值,即这个数据。

    所谓值传递,就是传递这个数据的一份copy。

    我们对copy做任何操作,都不会影响到原始值。

  • 引用传递

    引用,即这个内存地址。

    所谓引用传递,就是传递这个内存地址。

    我们对内存地址做任何操作,实质上就是在对内存地址所代表的这块内存做操作,所以会影响到这块内存所保存的数据本身。

用两段代码来验证一下,JS的传参,到底传的是什么:

这里还要理解一个东西,即我们在查看或者说输出变量时,我们输出的是什么?肯定输出的是,变量所指向的那块内存保存的数据。

第一段代码,我们实参是基本数据类型,调用函数前后,实参输出结果没变,即实参指向的那块内存保存的数据没变;

第二段代码,我们实参是对象,调用函数前后,实参输出结果改变了,即实参指向的那块内存保存的数据被函数改变了;

所以,我们可以得出结论,传参的时候:

  • 传基本数据类型时,是值传递;
  • 传对象时,是引用传递;

最新文章

  1. display:none与visibility:hidden区别
  2. Android 软件开发之如何使用Eclipse Debug调试程序详解及Eclipse常用快捷键(转)
  3. javascript中数组concat()join()split()
  4. sencha touch 入门系列 (二)sencha touch 开发准备
  5. iOS8 UIAlertController弹出框中添加视图(例如日期选择器等等)
  6. mysql应用存储过程批量插入数据
  7. IOS中调整UI控件位置和尺寸
  8. 支持 IE8 IE11 和 FF, Chrome 浏览器的圆角
  9. Android GridView 二维布局界面
  10. javascript 常用函数
  11. docker入门【1】
  12. Java容器:Stack,Queue,PriorityQueue和BlockingQueue
  13. 【子集或者DFS】部分和问题
  14. 使用 Zabbix 监控 Jenkins
  15. 检查Rabbitmq中队列及消息个数,还有清空的方法
  16. android: ADB错误“more than one device and emulator”
  17. 设置pip的默认源
  18. Qt环境配置 + Qt使用教程
  19. Linux进程调度的运行队列
  20. 第七篇:Logistic回归分类算法原理分析与代码实现

热门文章

  1. 我的 Kafka 旅程 - 性能调优
  2. 220726 T2 Multisets (思维)
  3. 华为交换机STP常用命令
  4. JavaScript中的代码执行顺序
  5. NLP之TextLSTM(预测单词下一个字母)
  6. 消息队列之RabbitMQ介绍与运用
  7. IP分类与子网划分
  8. 嵌入式-C语言基础:字符串结束标识符
  9. GAC简述
  10. 少走点弯路:Wiki.js 通过 Generic OAuth2 进行身份验证