前言

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)

推荐文献

JavaScript之参数传递方式的更多相关文章

  1. 深入理解javascript函数参数与闭包(一)

    在看此文章,希望先阅读关于函数基础内容 函数定义与函数作用域 的章节,因为这篇文章或多或少会涉及函数基础的内容,而基础内容,我放在函数定义函数作用域 章节. 本文直接赘述函数参数与闭包,若涉及相关知识 ...

  2. 学习JS的心路历程-参数传递方式(上)

    很多人认为JS的传递方式是值是Call by value, 物件及数组是Call by Reference.甚至还有人宣称其实JS是Call by sharing,那到底是哪一个呢? 这两天我们一一来 ...

  3. 【整理】--C++三种参数传递方式

    在C++中,共有三种参数传递方式: 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) (1)按值传递的过程为:首先计算 ...

  4. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  5. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  6. javaScript动态参数

    javaScript是动态语言,那么动态参数的话也是与生俱来的, 在去取javaScript得参数用的是Arguments这个属性,去取 <script type="text/java ...

  7. Java 函数参数传递方式详解 分类: Java Game 2014-08-15 06:34 82人阅读 评论(0) 收藏

    转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式:  A. 是按值传递的?  B. ...

  8. JavaScript 函数参数是传值(byVal)还是传址(byRef)?

    对于“JavaScript 函数参数是传值(byVal)还是传址(byRef)”这个问题,普遍存在一个误区:number,string等“简单类型”是传值,Number, String, Object ...

  9. Java函数参数传递方式详解

    在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简 ...

随机推荐

  1. Physical Education Lessons CodeForces - 915E (动态开点线段树)

    Physical Education Lessons CodeForces - 915E This year Alex has finished school, and now he is a fir ...

  2. Path variable [contentHash:8] not implemented in this context: styles.[contentHash:8].css

    webPack 升级到 4.3.0 导致 extract-text-webpack-plugin 无法使用  

  3. HDU4465 Candy

    Candy Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  4. golang打包和部署到centos7

    一.环境说明:VS code 二.编译: set GOOS=linux set GOARCH=amd64 go build -o "packageName"   三.发布 上传到服 ...

  5. hbase实践之HFile结构

    本文目录如下所示: 目录 HFile在HBase架构中的位置 什么是HFile HFile逻辑结构 HFile逻辑结构的优点 HFile物理结构 HFile生成流程 HFile中Block块解析 多大 ...

  6. redis geo操作

    package club.newtech.qbike.trip.domain.service; import club.newtech.qbike.trip.domain.core.Status;im ...

  7. 4、docker镜像:花卷结构、commit镜像

    1.是什么 docker images 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. ...

  8. eq(index|-index)

    eq(index|-index) 概述 获取当前链式操作中第N个jQuery对象,返回jQuery对象,当参数大于等于0时为正向选取,比如0代表第一个,1代表第二个.当参数为负数时为反向选取,比如-1 ...

  9. HZOJ 20190818 NOIP模拟24题解

    T1 字符串: 裸的卡特兰数题,考拉学长讲过的原题,就是bzoj3907网格那题,而且这题更简单,连高精都不用 结论$C_{n+m}^{n}-C_{n+m}^{n+1}$ 考场上10min切掉 #in ...

  10. 清北学堂-贪心-bfs

    输入样例: 3 5 10 5 4 10 8 1 10 1 3 1 4 1 5 1 3 2 1 2 5 4 3 4 3 4 5 5 1 1 4 4 6 1 9 4 7 2 9 5 10 5 2 8 8 ...