JS中的函数参数传递到底是按值传递还是按引用传递
首先我们知道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中的函数参数传递到底是按值传递还是按引用传递相关推荐
- JS OOP -02 深入认识JS中的函数
深入认识JS中的函数: 1.概述,认识函数对象 2.函数对象和其他内部对象的关系 3.将函数作为参数传递 4.传递给函数的隐含参数:arguments 5.函数的apply,call方法和length ...
- JS中Promise函数then的奥秘探究
JS中Promise函数then的奥秘探究 Promise概述 Promise对象是CommonJS工作组提出的一种规范,目的是为异步操作提供统一接口. 那么,什么是Promises? 首先,它是一个 ...
- java js中 function函数报错_浅析JS中对函数function的理解(基础篇)
正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...
- JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype
一)函数 A)JS中的函数的定义格式: function add(a,b) { var sum = a+b; document.write("两个数的和是:" + sum); // ...
- JS中的函数声明和函数表达式
JS中的函数声明和函数表达式 1. 函数声明定义一个具有指定参数的函数 函数声明提升, 函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用 hoist ...
- 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 -- ...
- 谈谈JS中的函数劫持
说到劫持,第一反应可能是什么不好的东西.函数劫持并不邪恶,关键是看使用的人.虽然这个概念在前端领域使用较少,但是在安全领域.自定义业务等场景下还是有一定的使用价值的.所以,这一篇文章将会和大家一起去了 ...
- Js中匿名函数的理解
目录 1.js中匿名函数的N种写法 最常见的用法: 2.JavaScript 匿名函数及闭包 2.1 匿名函数 2.1.1 函数的定义 2.1.2 匿名函数的创建 2.2 闭包 2.3 举例 2.4 ...
- 详解 JS 中 a.x = a = {} 到底发生了啥?(图文并茂,包你看懂)
直奔主题,先贴上代码: let a = {n:1}a.x = a = {n:2}console.log(a.x) console.log(a.x) 输出什么呢? 作为一个初学者,我的第一反应还是挺懵的 ...
最新文章
- PostgreSQL 打开文件句柄优化 - 百万以上实体对象初始化优化
- c语言主范式与编码,超详细!终于搞明白KMP算法
- 【虚拟化】docker创建mysql镜像,docker内部操作mysql
- C++检查给定数字是否为4的幂的算法实现(附完整源码)
- 从Linux到Meego
- Ubuntu下如何正确安装FFmpeg
- 文献阅读 - Genome-wide consequences of deleting any single gene
- 关于Bus的几个问题
- mysql案例~非常规操作汇总
- 在ASP.NET中自动给URL加上超级链接
- a标签下载文档 a下载文档失败问题 跨域调用
- 在图书馆使用计算机管理属于,图书馆计算机使用管理规定
- Java 遍历JsonNode
- (实测)天猫商城抢购茅台脚本
- 跨境物流主要流程是什么样?
- 三维地理信息平台介绍与比较
- 读《大学生上课为什么一定要认真听讲》有感
- 谷歌浏览器关闭安全模式, 访问 http网站
- html发展时间轴纵向插件,jquery响应式垂直时间轴插件vertical-timeline
- OAuth2.0第三方授权原理与实战
热门文章
- 地图上雷达探测到的物体实时映射到雷达图上
- JAVA第二次作业《胖瘦程度计算》
- 5个超实用的浏览器插件,让你的上网体验翻天覆地!
- 软考干货 | 备考进行ing!该怎么备考呢?
- F 魏迟燕的自走棋(思维+贪心+并查集维护联通块/左部点配对边<=2的匈牙利)
- LeetCode题解(1647):字符频次唯一的最小删除次数(Python)
- Spring当中循环依赖很少有人讲,今天让我们来看看吧
- C语言 读写锁pthread_rwlock_init
- 使用video.js播放手机本地视频
- 实现斗地主牌的大小顺序,实现分发牌的顺序,每个人手中的牌按照大小排序