前言

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)

推荐文献

最新文章

  1. 解决项目中.a文件的冲突
  2. Ubuntu下安装Koala
  3. 悲惨记忆。。QImage之 pixel() && setPixel()参数不要给反了。。。
  4. js代码学习
  5. Javascript中length属性的总结
  6. .net+easyui系列--Pagination 分页
  7. Navicat的快捷键
  8. get get_children方法
  9. Android学习笔记(二)Git和Github
  10. 解决linux netcore https请求使用自签名证书忽略安全检查方法
  11. 《SQL CookBook 》笔记-第一章-检索记录
  12. centos 网卡状态
  13. 百度UEditor的config.json
  14. docker基础学习(一)
  15. 小程序 navigator 无法跳转 tabBar上的页面
  16. 迷宫最短路径问题的dfs,bfs实现
  17. MultiImageSelector 仿微信选择多张图片回调
  18. spy-debugger 前端调试工具
  19. POJ 1836
  20. NBUT 1218 You are my brother 2010辽宁省赛

热门文章

  1. 3. caffe中 python Notebook
  2. js修改元素的属性
  3. 说说lock到底锁谁(II)?
  4. vue中父组件使用props或者$attras向子组件中传值
  5. golang struct的使用
  6. Google 的Web开发相关工具
  7. ACM-ICPC 2017 南宁赛区现场赛 M. The Maximum Unreachable Node Set(二分图)
  8. Educational Codeforces Round 33 (Rated for Div. 2) B题
  9. List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
  10. Django Admin中增加导出CSV功能