JS参数传递(值传递和引用传递)

前端红宝书第一遍看过去之后,相当多的东西都忘记了,第二遍看的时候,也开始注意到一些细节的东西以及理解不到位的地方。

书P66 一个加粗框中写到:ECMAScript中所有参数传递都是值,不可能通过引用传递参数

当时看过没有怎么仔细想过,一知半解吧,今天理解的更加深一些。当然也是昨天做了个题目就因为这个掉坑里一时没爬出来!

访问变量有按值和按引用两种方式,而参数只能按值传递。

一、基本数据类型: Number, String等都是按值传递这个好理解,当时我也就理解这个吧。


var a = 10
function add(num){
    num+=10
}
add(a)
console.log(a)

如上面的代码,执行add(a)的时候,会复制一份值给函数的arguments这伪数组,当然同时也是num这个命名参数。arguments[0] = num,函数内部对num进行了加操作,num = 20了。但是外部最后输出a时,仍然是10,说明a与函数内部的num互不干扰。其实此时可以把命名参数看成是局部参数,函数运行结束,它也随之销毁。而它是按值传递的,复制了内存中的一份值给num。所以内部对num的操作不影响全局变量a的值

二、基本类型的值好理解,但是JS中对象类型的就不怎么好理解了,反正令我觉得有点绕;

先看例子:

var student = new Object()
function addNum (obj) {
    obj.num = '23'
}
 
addNum(student)
 
console.log(student.num)

如上,首先定义了一个student对象,然后通过函数给该对象添加了num学号的属性值:23。之后打印输出的时候,很奇怪,居然给student对象添加上了属性,并且影响到了外部对象,这传值明显就是引用传递啊,函数内部obj和student都指向堆中同一个对象。就是引用传递嘛。但是又和红宝书上写的矛盾:不可能通过引用传递参数??这就莫名奇妙了。

查阅了很多大神写的说明,但是感觉都不能够说明,真是非常难理解。我觉得是不是这样理解:以上述函数为例,我把student对象实例作为参数传递给obj时,是将student所指对象的地址复制了一份给obj,这样obj空间所存的地址和student就都指向了共同的存储空间。而如果是引用传递的话,obj是没有空间的,它将会和student公用一个空间,这个空间就保存着一个指向student实例对象的地址。


作者:御命-丹心
来源:CSDN
原文:https://blog.csdn.net/weixin_39728230/article/details/80607294

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容