JaVAScript之参数传递方式

前言

nodejs项目中遇到此问题了,具体啥需求暂时不说~
本博文,关于理论部分,主要是摘抄"推荐文献"第一篇;关于实验部分是看该博文以前作的,二者无干系。javascript

【结论】对于普通函数,javascript的传参不是call by reference(按引用)而是 call by sharing(按共享传递)。
最终我想知道的结果就是,函数内部的操做是能够【修改】原传递的参数对象的值的。java

  • 按值传递:

形参会把实参的内存拷贝一下,这时形参和实参是两块内存,因此修改形参的内存,不会影响到实参的内存。因此形参的改变不会影响到实参。例如上面的num变量,能够看作将num的内存复制给形参num,这时候值为10的内存有两块,函数内部操做的是形参的内存,与函数外的内存无关。node

  • 按引用传递:

首先实参自己就是一个保存内存地址的变量(注意并非直接的内存而是内存所在的地址),而后形参将这个指向内存的地址拷贝下来给形参,此时内存只有一块,只是有两个引用指向它。因此当你修改它的内存时候其实影响到了两个引用。
例如上面代码中的obj1修改name属性时,由于person1和obj1的name的属性保存的都是一块内容为”张三”的内存,因此当咱们修改它的时候,person1和obj1都会被影响到。函数

  • 按共享传递.net

    它与引用传递的不一样是,引用并无内存,例如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)

推荐文献

相关文章
相关标签/搜索