传递参数的2种情况的理解。

最近差不多一个月没写博客了,主要的原因是目前在使用 Markdown 写学到的一些心得,一方面方便记笔记,另一方面页面排版更加的美观。

个人笔记站点 : https://yewenxiang23.github.io


碰到的问题:

今天碰到一个关于传递参数的问题,想了一下午,终于想通了,打算总结记录一下:

解决的思路:传参是值复制的一个过程,传递的是值,

1         function setName(obj){
2             obj.name = "yewenxiang";
3             obj = new Object();
4             obj.name = "ye";
5         }
6         var person = new Object();
7         setName(person);
8         console.log(person.name); //yewenxiang

上面的代码输出了 "yewenxiang",而不是"ye"。感觉非常的怪异,下面来对于传递参数做一个总结。


 

传递参数:

  • 所有的函数参数都是按值传递的

   也就是说,把函数的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。

值有两种类型:

  • 基本类型:值保存在栈内存中,复制的时候也是把值同时也复制了一份。
  • 引用类型:值保存在堆内存中,栈内存中保存的只是指向堆内存中值的一个指针,复制的时候纸箱基本类型传参:

例子就拿 《javascript高级程序设计》上的例子来说

基本类型的值传参:

1 function addTen(num){
2             num += 10;
3             return num;
4 }
5 var count = 20;
6 var result = addTen(count);
7 console.log(count); //20
8 console.log(result); //30

函数 addTen() 有一个num 参数,而参数实际上是函数的局部变量。在调用这个函数,并传入参数 count时。由于 count的值为20,传递参数的过程是一个值得复制过程,也就是把 count 的值20,复制给了参数(函数的局部变量) num = 20。在堆内存中存在了 count=20 和num=20,两个变量是互相不干扰的。

引用类型的值传参:

1         function setName(obj){
2             obj.name = "yewenxiang";
3         }
4         var person = new Object();
5         setName(person);
6         console.log(person.name); //"yewenxiang"

这个例子中传入了一个 person 对象,也就是引用类型,引用类型的复制和基本类型的复制不同,复制的是栈内存 变量person 中保存的地址,这个地址也指向堆内存中同一个对象。所以修改了函数局部变量 obj的name属性为"yewenxiang" ,person.name也变为了"yewenxiang"。

证明参数是按值传递的一个例子:

1         function setName(obj){
2             obj.name = "yewenxiang";
3             obj = new Object();
4             obj.name = "ye";
5         }
6         var person = new Object();
7         setName(person);
8         console.log(person.name); 

这是我碰到的问题,开始我想的是输出 "ye" ,为什么会输出 "yewenxiang"呢。明明obj代表的是person这个对象,而函数内部赋值之后又重新构造了一个新对象并赋值为 "ye",所以应该输出 "ye"啊,为什么不是呢?那肯定是想错了嘛。废话少说 直接上图:

上面3.4行代码执行之前:

3.4行代码执行之后:

由于obj为函数的局部变量,那么我们如何证明呢?

 1         function setName(obj){
 2             obj.name = "yewenxiang";
 3             console.log(obj.name); //yewenxiang
 4             obj = new Object();
 5             obj.name = "ye";
 6             console.log(obj.name); //ye
 7         }
 8         var person = new Object();
 9         setName(person);
10         console.log(person.name); //yewenxiang
11         console.log(obj.name); //报错

这样就证明了我的想法是正确的。

 

   

 

转载于:https://www.cnblogs.com/yewenxiang/p/6337961.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑技巧:电脑卡顿的4个优化小技巧,太有用了

目录 一、调整电脑处理器性能 二、关闭系统自动更新 三、设置“处理器”个数 四、开机加速 电脑经常卡顿,就会严重影响了大家的工作效率,其实你的电脑可以开启“加速”优化设置来提升电脑的性能,今天小编就来给大家分享四个能减少电脑卡顿的实…

电脑技巧:微软电脑管家测试版发布,赶快来体验一下

目录 1、前言 2、官网地址 3、安装界面 4、运行主界面 5、功能介绍 5.1电脑体验 5.2 病毒查杀 5.3 垃圾清理 5.4 优化加速 6、总结 1、前言 2022年1月底,有开发者在网上放出了微软电脑管家V1.0的内测安装包,宣称是微软中国的团队自主研发的针对Winows操作…

Spring系列(十二):AOP相关知识笔记

目录 1、AOP定义 2、AOP的用途 3、AOP常用的注解 4、AOP实现Web统一日志Demo 4.1 新建IErrorCode.java 接口类 4.2 新建ResultCode.java 接口类 4.3 新建WebLog.java 4.4 新建WebLogAspect.java 类 4.5 新建测试控制器TestLogController.java 今天给大家分享AOP相关的知识&…

跨域学习笔记2--WebApi 跨域问题解决方案:CORS

自己并不懂,在此先记录下来,留待以后学习... 正文 前言:上篇总结了下WebApi的接口测试工具的使用,这篇接着来看看WebAPI的另一个常见问题:跨域问题。本篇主要从实例的角度分享下CORS解决跨域问题一些细节。 WebApi系列…

电脑技巧:16个系统优化设置小技巧,大幅度提升你的电脑性能

目录 1. 注册你的Microsoft账户 2. 夜间模式 3. 关闭登录验证(办公机慎用) 4. 文件内容预览 5. 组件升级 6. 剪贴板增强 7. Caps Lock声音提醒 8. 自启动清理 9. 安装PowerToys 10. 文件历史记录 11. 动态锁 12. 就近共享 13. 搜索范围 14. “勒索”防护…

mongo文档操作

1.插入文档(插入一行记录) db.集合的名字.insert({}) 2.批量的插入 shell的for循环 3.save操作 save操作和insert操作的区别在于 如果_id相同的情况下,insert操作是会报错的,save则会更新。 4 删除列表中的所有数据 db.集合名字.r…

网络技巧:WiFi越用越慢的原因以及解决方法

WiFi越用越慢,到底是什么原因,今天小编给大家聊聊这个问题! 有人认为是WiFi盒子有问题,但其实和路由器的错误摆放也有一定关系。 今天给大家列出了几种路由器正确摆放的小技巧,而且不用花一分钱,就可以测试…

Win11系统各个版本之间的比较,看完你就懂了

目录 1、Win11系统哪个版本最好? 2、Win11有几个版本? 3、Windows11不同版本的比较 Win11系统是微软全新发布的电脑操作系统,当然Win11有着很多的版本,每一个版本功能定位都有一定的差异,那么Win11系统哪个版本最好呢&…

电脑:分享八个实用的电脑技巧

目录 1、会高效使用搜索,不要什么事都问别人。 2、要会正确下载、安装、卸载软件 3、会使用Office办公软件 4、掌握如何设置路由器、设置网络等网络技能 5、熟练使用键盘 6、定期整理自己的电脑桌面 7、定期优化自己的电脑 8、掌握一些常用的快捷键 电脑是目前从事办…

SpringMVC(十七-二十) ModelAttribute 注解

有点难理解。 修饰方法是表示在该控制器的所有目标方法执行前都执行该modelattribute注解的方法。 修饰参数是表示什么?修饰参数时modelattributes(value"xxxx") User user 中的value值需要和modelattribute修改的方法加入的键的值一致。 Controller Cod…

硬件知识:U盘缩水是怎么回事,如何恢复U盘真实容量?

使用缩水的U盘会造成什么后果呢?使用缩水U盘拷贝资料,很有可能造成重要资料文件的丢失,同时“无限制”拷贝资料,造成不可预知的错误。那要怎么办呢?其实最有效方法就是还原缩水U盘真实容量,这样在拷贝资料时…

网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?

相信很多人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系,今天小编给大家介绍一下,希望对大家能有所帮助! 一.带宽与宽带的区别是什么? 带宽是量词,指的是网速的大小,比如1Mbps的意思是一兆…

Java技术:SpringBoot实现邮件发送功能

目录 1、创建一个基本的SpringBoot项目,pom文件导入发送邮件的依赖 2、application.yml 文件配置配置邮件发送信息 3、创建IEmailService 接口文件,定义邮件发送的接口 4、创建IEmailService接口的实现类EmailService.java 文件 5、新建邮件发送模板 ema…

电脑技巧:Win10无线投屏功能介绍

Win10操作系统可以将电脑中的内容投屏到其他显示设备,比如将电脑屏幕投屏到电视上,这是通过Miracast技术来实现的。其实Win10电脑自身也可以作为被投屏的那一方!比如可以将手机屏幕投屏到电脑屏幕上去,方便给客户演示APP功能或者将…