JavaScript中的Pass by Value和Pass by Reference有什么区别?

145 阅读4分钟

JavaScript是一种编程语言,它使我们的网络应用程序和网页具有思考和行动的能力,使它具有互动性和动态性。像其他编程语言一样,JavaScript为我们提供了函数,它是一组定义好的命令或语句,只有当我们调用有这个代码的函数时才会执行。该函数接受一个输入或一些参数,并返回输出。输入参数可以通过值或引用来传递。

因此,在这篇文章中,我们将定义 "按值传递 "和 "按引用传递 "这两个术语,并结合JavaScript中的例子,解释两者之间的区别。

什么是逐值传递?

如果一个函数是逐值传递的,那么就直接通过发送变量的值作为参数来调用该函数。因此,在函数中所作的任何改变都不会对初始值或原始值产生影响。原始值没有改变,因为当我们把变量作为参数传入函数时,该变量的副本被创建,因此在该函数中进行的任何改变或操作都是对副本变量而不是原始变量进行的。

按值传递示例

让我们创建一个名为passByValue 的函数,并改变作为参数传入该函数的变量ab的值。在这个函数中,我们初始化a和b变量,并分别给它们1和2的值。然后我们在控制台记录这些值。

function passByValue(a, b) {

    a=3;

    b=4;

    console.log("Inside the function")

    console.log("a: ",a, " b: ",b); // 3, 4

}

 
let a = 1;

let b = 2;

console.log("Outside Function. Before calling function");

console.log("a: ",a, " b: ",b); // 1,2

 
passByValue(a, b);

 
console.log("Outside Function. After calling function");

console.log("a: ",a, " b: ",b); // 1,2

我们将看到,当我们在函数外控制台记录a和b的值时,它将显示1和2。然而,在函数内部,值将是3和4,并且在调用这个函数后,值不会改变,因为在函数内部对a和b进行了拷贝,并对这些拷贝进行了修改。

什么是旁证法?

一个函数的调用是通过提供变量的引用/地址作为旁证的参数。因此,在函数内修改数值也会修改函数外作为原始值的数值。逐次引用功能在JavaScript数组和对象中使用。

通过引用传递的例子

让我们初始化一个对象并给它两个属性。一个属性定义了机器的名称,另一个是 "isOn",让我们知道机器是否开启。我们也初始化一个名为passByReference 的函数,并改变计算机对象的属性值,如name和isOn。然后我们在调用该函数前后对这些属性进行控制台记录。

function passByReference(machine) {

    machine.name="Computer";

    machine.isOn = true;

}


var computer = {

    name: "myComputer",

    isOn: false

};

console.log("Before calling function");

console.log(computer.isOn); // true;

console.log(computer.name); // Computer


passByReference(computer);


console.log("After calling function");

console.log(computer.isOn); // true;

console.log(computer.name); // Computer

我们可以看到,在函数中没有进行复制,计算机对象的原始属性被改变了,因此它是通过引用传递的。

通过值传递和通过引用传递之间的区别

通过值传递和通过引用传递的主要区别是:通过引用传递在我们分配基元时发挥作用,而通过值传递在我们分配对象时发挥作用。基元数据类型包括字符串、数字、布尔值、符号以及null和undefined等值,而对象数据类型包括函数、数组和简单对象。

两者之间的第二个主要区别是,逐值传递会创建一个副本,然后对该副本进行修改;但在逐指传递中,不会创建副本,而是对原始变量进行修改。

总结

我们可以通过逐值传递或逐参考传递的方式将值传递到一个函数中。通过值传递是在原始数据类型上进行的,如字符串、数字、布尔,每次你将一个变量传递给一个函数时,它都会创建一个该变量的副本,然后在通过值传递中修改该副本。通过引用传递是在对象数据类型上进行的,如函数、数组和普通对象,在通过引用传递中,原始值被修改,因为通过引用传递并不创建副本。

在这篇文章中,首先,我们看到了什么是逐值传递和逐参考传递,并借助一个例子解释了这两种现象,然后继续我们的讨论,回答了JavaScript中的逐值传递和逐参考传递有什么区别。