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