在逆战班学习JS的第二周,对于我来说收获满满。众所周知,在JavaScript里调用函数传参的方式分为值传递和引用传递两中方式,在这里我们来研究一下,值传递和引用传递的区别。
首先我们拿概念来说,在js函数传参时,如果传递的是数值类型的数据我们称之为“值传递”,如果传递的是对像类型的数据,我们称之为“引用传递”。
在计算机的内存区域中分为两种区域,一种是“栈”,一种是“堆”。“栈内存”中储存着JS的5种基本数据类型Undefined、Null、Boolean、Number 和 String,它们可以直接被访问。引用类型的值是保存在堆内存中的对象,而Js不允许直接访问堆内存中的位置, 也就是说不能直接操作堆内存中的对象。
进一步通过代码来解析“值传递”和“引用传递”的过程:
一、函数的值传递类型
代码如下:
// 定义一个k变量让他作为实参传递给函数add的形参n
var k = 10;
function add(n){ // 此时 n=10
n += 20; // n=10 + 20
return n;
}
var res = add(k);
console.log(k); // k = 20
console.log(res); // res = 30
此时就是函数外部定义的参数作为实参直接赋值给了函数内部定义的形参,进而以数值的形式参与计算,也就是说值传递时不分地址和值,地址就是值,值就是地址。
二、函数的值传递类型
代码如下:
// 以构造函数创建方式创建一个对象
var obj = new Object();
function target(obj1){ // 此时则类似于 obj = obj1
obj1.name = "admin",
obj1.age = 18,
obj1.like = "打篮球",
}
target(obj);
console.log(obj.name + obj.age + obj.like)
// 此时相当于obj1创建了一个内容,将obj1存储内容的地址给了obj
答案:
此时相当于obj1创建了一个内容,将obj1储存内容的地址给了obj,也就是说引用传递区分地址和值,地址是地址,值是值,找到地址后,需要根据地址说明储存的位置,才能找到对应的值。
三、综合上述:
区别一:值传递传递的是数值类型的数据,引用传递传递的是对象类型的数据。
区别二:值传递的数据储存在“栈”内,引用传递的数据储存在“堆”内。
区别三:值传递时不分地址和值,地址就是值直接传递,而引用传递是区分地址和值的,在传递时只是把地址传递,而值并没有传递。