JavaScript 按值调用与按引用调用

JavaScript 按值调用与按引用调用

按值调用: 在这种方法中,实际参数的值被复制到函数的形式参数中,并且这两种类型的参数存储在不同的内存位置。因此,在函数内部进行的任何更改都不会反映在调用者的实际参数中。

假设有一个名为 “a” 的变量。现在,我们在变量 “a” 中存储一个基本值(布尔值,整数,浮点数等)。让我们在 “a” 中存储一个整数值,即a=5。现在变量 “a” 存储5,并且有一个地址位置,在内存中存储该基本值。

现在,假设我们通过赋值将 “a” 的值复制到 “b” 中(a=b)。现在, “b” 指向内存中的一个新位置,其中包含与变量 “a” 相同的数据。

因此,a=b=5,但两者都指向内存中的不同位置。

这种方法称为 按值调用 ,其中两个变量通过复制值而成为相同的值,但在内存中的两个不同位置。

按值调用的特点:

  • 函数参数始终是按值传递的。
  • 它将传递给函数的变量的值复制到本地变量中。
  • 这两个变量在内存中占据不同的位置。因此,如果对特定的变量进行更改,不会影响另一个变量。

示例: 此示例展示了上述方法的使用。

// By value (primitives)
let a = 5;
let b;
b = a;
a = 3;
console.log(a);
console.log(b);

输出: “b”只是“a”的一个副本。它在内存中有自己的空间。当我们改变“a”时,不会对“b”的值产生任何影响。

3
5

按引用调用: 假设我们有一个存储在变量中的对象 “a” 。变量存储对象所在的位置或地址。现在我们设置 “b=a” 。现在新变量 “b” 不再指向内存中的新位置,而是指向与 “a” 相同的位置。不会创建新的对象,也不会创建副本。两个变量都指向同一个对象。这就像有两个名字。

这被称为 按引用调用 。它的行为与按值调用非常不同。所有对象都通过引用进行交互。

按引用调用的特点:

  • JavaScript中,所有对象都通过引用进行交互。
  • 如果一个对象存储在一个变量中,并且将该变量赋值给另一个变量,那么它们两个占用内存中的同一位置。
  • 对一个对象变量的更改会影响另一个对象变量。

实例: 在这里,当我们设置 “d=c” 时, “d” 指向与 “c” 相同的内存位置。首先,我们在 “c” 中存储了一个名称-值对。现在,当我们使用 “c” 更改属性时,它也会更改 “d” 中的属性,因为两者都指向同一个对象。对一个对象的更改会影响另一个对象。

// By reference (all objects (including functions))
let c = { greeting: 'Welcome' };
let d;
d = c;
 
// Mutating the value of c
c.greeting = 'Welcome to geeksforgeeks';
console.log(c);
console.log(d);

输出:

{greeting: 'Welcome to geeksforgeeks'}
{greeting: 'Welcome to geeksforgeeks'}by

值传递和引用传递的区别:

按值传递 按引用传递
在其他变量发生改变时,原始变量不会被修改。 在其他变量发生改变时,原始变量会被修改。
实际变量和复制变量将被创建在不同的内存位置。 实际变量和复制变量将被创建在相同的内存位置。
在函数中传递变量时,对传递的变量进行的任何改变都不会影响原始变量。 在函数中传递变量时,对传递的参数进行的任何改变都会更新原始变量的引用。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程