传递参数的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
传递参数的2种情况的理解。相关推荐
- Django通过URL传递参数的4种方法
[转自ian的个人博客]http://www.icodelogic.com/?p=501 感谢ian的总结! 1 无参数情况 配置URL及其视图如下: (r'^hello/$', hello) de ...
- vue-router 传递参数的几种方式
本文转载自:https://blog.csdn.net/crazywoniu/article/details/80942642 vue-router传递参数分为两大类 编程式的导航 router.pu ...
- Asp.net页面之间传递参数的几种方法
Asp.net页面之间传递参数的几种方法 第一种方法: 通过URL链接地址传递Request.QueryString send.aspx: protected void Button1_Clic ...
- 表单提交和超链接请求传递参数的几种方式
表单提交和超链接请求传递参数的几种方式 这段时间在使用easy-ui的datagrid,他有自己提交表单的方式,所以就整理整理页面对参数的提交方式: 注:下面代码都已经过测试. 1. HTML提交表单 ...
- jmeter跨线程组传多个值_Jmeter 跨线程组传递参数 之两种方法(转)
终于搞定了Jmeter跨线程组之间传递参数,这样就不用每次发送请求B之前,都需要同时发送一下登录接口(因为同一个线程组下的请求是同时发送的),只需要发送一次登录请求,请求B直接用登录请求的参数即可,直 ...
- Asp.net页面之间传递参数的几种方法荟萃
第一种方法: 通过URL链接地址传递 send.aspx: protected void Button1_Click(object sender,EventArgs e) { ...
- jsp传递参数的四种方法
1.form表单 2.request.setAttribute();和request.getAttribute(); 3.超链接:<a herf="index.jsp"?a= ...
- Android开发之fragment传递参数的两种方法
非常简单一种是通过bundle,另外一种是通过fragment提供的instantiate(过时方法),都是kotlin版本,直接上代码吧: 方法一: //fragment传递参数方法一val fra ...
- [转]Delphi过程函数传递参数的几种方式
在Delphi过程.函数中传递参数几个修饰符为Const.Var.Out.另一种不加修饰符的为默认按值传递参数. 一.默认方式以值方式传递参数 procedure TForm1.ProcNormal( ...
最新文章
- 优化系统后VS启动不了问题的一种解决方案
- 谷歌相册也不能无限白嫖了,「地主家」也烧不起免费网盘
- android学习日记24--Android 菜单开发
- 1031 Hello World for U (20 分)【难度: 一般 / 知识点: 找规律】
- VTK:彩色海拔地图用法实战
- Java类型推断将不再支持可变性规范
- Docker之DockerFile讲解
- 注意!下个月开始 GitHub 新建存储库的默认分支就不叫“master”了!
- 博图帮助乱码解决方法
- 基于大数据的资金流量分析:思路与应用前景设想
- 新加坡政府开放数据门户网站
- 记参加 2022 Google开发者大会
- linux中原子操作atomic_read、atomic_set、atomic_add、atomic_sub
- win10磁盘100%占用
- Python-各种Loss总结
- 【C4D周练作业031-040】周练作业渲染了个奥特曼哈哈~
- class 和 def
- 将DataFrame中的时间转换为时间戳
- SAP 数据字典常用数据类型
- 什么是企业防火墙,什么是策略?