JavaScript之参数传递方式
前言
nodejs项目中遇到此问题了,具体啥需求暂时不说~
本博文,关于理论部分,主要是摘抄"推荐文献"第一篇;关于实验部分是看该博文之前做的,两者无干系。
【结论】对于普通函数,javascript的传参不是call by reference(按引用)而是 call by sharing(按共享传递)。
最终我想知道的结果就是,函数内部的操作是可以【修改】原传递的参数对象的值的。
- 按值传递:
形参会把实参的内存拷贝一下,这时形参和实参是两块内存,所以修改形参的内存,不会影响到实参的内存。所以形参的改变不会影响到实参。例如上面的num变量,可以看做将num的内存复制给形参num,这时候值为10的内存有两块,函数内部操作的是形参的内存,与函数外的内存无关。
- 按引用传递:
首先实参本身就是一个保存内存地址的变量(注意并不是直接的内存而是内存所在的地址),然后形参将这个指向内存的地址拷贝下来给形参,此时内存只有一块,只是有两个引用指向它。所以当你修改它的内存时候其实影响到了两个引用。
例如上面代码中的obj1修改name属性时,因为person1和obj1的name的属性保存的都是一块内容为”张三”的内存,所以当我们修改它的时候,person1和obj1都会被影响到。
- 按共享传递
它与引用传递的不同是,引用并没有内存,例如c语言中的指针,只是一个指向;但是共享传递不是,它会将实参的所在的地址也拷贝进来,这个变量本身就可以看做一个内存,只是这个内存的一个值保存另一块内存的地址。所以我们可以运行上面的函数发现,obj2的值变了,但是person2没有任何影响,因为此时它们是两块不同的内存,而person1和obj1之所以可以变,是因为person1和obj1两块内存中的一个name所在的区域保存了指向一块内容为”张三”的内存的引用(内存地址),并且这块内存是惟一的,所以obj1表现的像是引用传递。
实验
function test(obj){
obj.name = "jack";
}
gg = {name:"3532",age:67};
test(obj);
console.log(gg)
推荐文献
最新文章
- 解决项目中.a文件的冲突
- Ubuntu下安装Koala
- 悲惨记忆。。QImage之 pixel() &;&; setPixel()参数不要给反了。。。
- js代码学习
- Javascript中length属性的总结
- .net+easyui系列--Pagination 分页
- Navicat的快捷键
- get get_children方法
- Android学习笔记(二)Git和Github
- 解决linux netcore https请求使用自签名证书忽略安全检查方法
- 《SQL CookBook 》笔记-第一章-检索记录
- centos 网卡状态
- 百度UEditor的config.json
- docker基础学习(一)
- 小程序 navigator 无法跳转 tabBar上的页面
- 迷宫最短路径问题的dfs,bfs实现
- MultiImageSelector 仿微信选择多张图片回调
- spy-debugger 前端调试工具
- POJ 1836
- NBUT 1218 You are my brother 2010辽宁省赛
热门文章
- 3. caffe中 python Notebook
- js修改元素的属性
- 说说lock到底锁谁(II)?
- vue中父组件使用props或者$attras向子组件中传值
- golang struct的使用
- Google 的Web开发相关工具
- ACM-ICPC 2017 南宁赛区现场赛 M. The Maximum Unreachable Node Set(二分图)
- Educational Codeforces Round 33 (Rated for Div. 2) B题
- List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
- Django Admin中增加导出CSV功能