首先我们知道JS中的数据类型大致可以分为简单数据类型和复杂数据类型;
当我们声明一个变量并给它赋值时,可以赋给其简单值和复杂值(以下堆内存和栈内存的地址表示均随意取的,只是为了区分,不代表真实的内存地址);
针对简单数据类型:
例1

var simpleData1 = 18
var simpleData2 = simpleData1
simpleData2 =  19
console.log(simpleData1 )   //打印出18

以上例子的过程为:先给simpleData1 在栈内存中分配一个地址s101,里面保存数字18,然后将simpleData1赋给simpleData2 ,相当于紧接着在栈内存中又分配一个地址s102,里面同样保存数字18,这时再将s102中的内容变成19,这当然不会影响s101中的内容。

针对复杂数据类型,以数组为例
例2

var arr1 = ['zyp','zyp','zyp']
var arr2 = arr1
arr2[0] = 'zyp1'
console.log(arr1)  //打印出 ["zyp1", "zyp", "zyp"]

以上例子的过程为:先在堆中开辟一块地址h1001来存数组[‘zyp’,‘zyp’,‘zyp’],同时将该堆内存的地址h1001存放在栈内存s103中,然后再在栈内存中开辟一个地址s104同样存放h1001,这时arr1和arr2指向同一块堆内存,改变其中的值会同时反映在变量arr1和arr2上。

例3

var arr1 = ['zyp','zyp','zyp']
var arr2 = arr1
arr2 =  ['zyp1','zyp1','zyp1']
arr2[0] = 'zyp2'
console.log(arr2) //打印出 ["zyp2", "zyp1", "zyp1"]
console.log(arr1) //打印出 ["zyp", "zyp", "zyp"]

以上例子的过程为:跟上面一样,先在堆中开辟一块地址h1001来存数组[‘zyp’,‘zyp’,‘zyp’],同时将该堆内存的地址h1001存放在栈内存s103中,然后再在栈内存中开辟一个地址s104同样存放h1001,这时arr1和arr2指向同一块堆内存。不同的是:这时我们又在堆内存中开辟出一块新的地址h1002来存放新数组[‘zyp1’,‘zyp1’,‘zyp1’],新地址h1002存放在s104中,这时arr2中保存的地址已经由h1001变成了h1002, 这时再改变h1002对应的堆内存中的值,便和arr1没有任何关系了。

明白了上述赋值过程再来理解函数传参便是一个道理了

function changeObj(arr1) {arr1= ['a1', 'a1', 'a1']
}
var arr = ['a', 'a', 'a']
changeObj(arr)
console.log(arr)  // 打印出["a", "a", "a"]

这个例子中:假设数组[‘a’, ‘a’, ‘a’]在堆内存中对应的地址为:h2001, 实参arr在栈内存中对应的地址为s201, 里面保存的是h2001。调用changeObj函数时,将arr复制给arr1,这里对应的操作是自动将在栈内存中分配一块地址s202来保存h2001,因此arr和arr1对应的是同一块堆内存,但这时又在堆内存中开辟新空间h2002来保存数组[‘a1’, ‘a1’, ‘a1’],h2002保存在arr1对应的栈内存s202中,这里的道理就和例3是一样的了

JS中的函数参数传递到底是按值传递还是按引用传递相关推荐

  1. JS OOP -02 深入认识JS中的函数

    深入认识JS中的函数: 1.概述,认识函数对象 2.函数对象和其他内部对象的关系 3.将函数作为参数传递 4.传递给函数的隐含参数:arguments 5.函数的apply,call方法和length ...

  2. JS中Promise函数then的奥秘探究

    JS中Promise函数then的奥秘探究 Promise概述 Promise对象是CommonJS工作组提出的一种规范,目的是为异步操作提供统一接口. 那么,什么是Promises? 首先,它是一个 ...

  3. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  4. JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype

    一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); // ...

  5. JS中的函数声明和函数表达式

    JS中的函数声明和函数表达式 1. 函数声明定义一个具有指定参数的函数 函数声明提升, 函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用 hoist ...

  6. js中trim函数_30天中的30个Excel函数:03 – TRIM

    js中trim函数 Yesterday, in the 30XL30D challenge, we took a poke at the lazy brother-in-law function -- ...

  7. 谈谈JS中的函数劫持

    说到劫持,第一反应可能是什么不好的东西.函数劫持并不邪恶,关键是看使用的人.虽然这个概念在前端领域使用较少,但是在安全领域.自定义业务等场景下还是有一定的使用价值的.所以,这一篇文章将会和大家一起去了 ...

  8. Js中匿名函数的理解

    目录 1.js中匿名函数的N种写法 最常见的用法: 2.JavaScript 匿名函数及闭包 2.1 匿名函数 2.1.1 函数的定义 2.1.2 匿名函数的创建 2.2 闭包 2.3 举例 2.4 ...

  9. 详解 JS 中 a.x = a = {} 到底发生了啥?(图文并茂,包你看懂)

    直奔主题,先贴上代码: let a = {n:1}a.x = a = {n:2}console.log(a.x) console.log(a.x) 输出什么呢? 作为一个初学者,我的第一反应还是挺懵的 ...

最新文章

  1. PostgreSQL 打开文件句柄优化 - 百万以上实体对象初始化优化
  2. c语言主范式与编码,超详细!终于搞明白KMP算法
  3. 【虚拟化】docker创建mysql镜像,docker内部操作mysql
  4. C++检查给定数字是否为4的幂的算法实现(附完整源码)
  5. 从Linux到Meego
  6. Ubuntu下如何正确安装FFmpeg
  7. 文献阅读 - Genome-wide consequences of deleting any single gene
  8. 关于Bus的几个问题
  9. mysql案例~非常规操作汇总
  10. 在ASP.NET中自动给URL加上超级链接
  11. a标签下载文档 a下载文档失败问题 跨域调用
  12. 在图书馆使用计算机管理属于,图书馆计算机使用管理规定
  13. Java 遍历JsonNode
  14. (实测)天猫商城抢购茅台脚本
  15. 跨境物流主要流程是什么样?
  16. 三维地理信息平台介绍与比较
  17. 读《大学生上课为什么一定要认真听讲》有感
  18. 谷歌浏览器关闭安全模式, 访问 http网站
  19. html发展时间轴纵向插件,jquery响应式垂直时间轴插件vertical-timeline
  20. OAuth2.0第三方授权原理与实战

热门文章

  1. 地图上雷达探测到的物体实时映射到雷达图上
  2. JAVA第二次作业《胖瘦程度计算》
  3. 5个超实用的浏览器插件,让你的上网体验翻天覆地!
  4. 软考干货 | 备考进行ing!该怎么备考呢?
  5. F 魏迟燕的自走棋(思维+贪心+并查集维护联通块/左部点配对边<=2的匈牙利)
  6. LeetCode题解(1647):字符频次唯一的最小删除次数(Python)
  7. Spring当中循环依赖很少有人讲,今天让我们来看看吧
  8. C语言 读写锁pthread_rwlock_init
  9. 使用video.js播放手机本地视频
  10. 实现斗地主牌的大小顺序,实现分发牌的顺序,每个人手中的牌按照大小排序