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