📜  Javascript中的值传递和引用传递(1)

📅  最后修改于: 2023-12-03 14:42:40.352000             🧑  作者: Mango

Javascript中的值传递和引用传递

在Javascript中,变量可以存储不同类型的值(如字符串、数字、布尔值、对象等)。在函数调用时,这些变量被传递给函数,以便对其进行操作或处理。但是,Javascript中的变量传递有两种不同的方式,即值传递和引用传递。

值传递

当使用值传递时,仅仅是将一个变量的值复制到另一个变量中。这意味着在函数中对该变量所做的任何更改都不会影响原始变量。在Javascript中,具有原始值(如字符串、数字、布尔值等)的变量是按值传递的。

以下是一个实例:

function foo(a) {
   a = 10;
   console.log(a); // 输出 10
}

var b = 5;
foo(b);
console.log(b); // 输出 5

在这个例子中,b变量是一个具有原始值的变量(数字型),因此在函数调用期间使用值传递。因此,a被初始化为一个新的变量,该变量包含b的值,并且对a的更改不会影响原始的b

引用传递

当使用引用传递时,传递给函数的变量是一个对原始变量的引用,而不是复制变量的值。这意味着在函数中对该变量所做的任何更改都会影响原始变量。在Javascript中,具有对象值(如数组、函数、对象等)的变量是通过引用传递的。

以下是一个实例:

function bar(obj) {
   obj.param = "Update";
   console.log(obj); // 输出 Object { param="Update" }
}

var obj = { param: "Initial" };
bar(obj);
console.log(obj); // 输出 Object { param="Update" }

在这个例子中,obj变量是具有对象值的变量,因此在函数调用期间使用引用传递。因此,obj是原始变量的引用,并且在函数中对其进行更改也会影响原始变量。

注意事项

当使用对象和数组等具有对象值的变量时,必须非常小心。因为它们是通过引用传递传递的,而不是按值传递。这意味着在函数中对该变量所做的任何更改都可能影响其他变量,因此需要特别小心一些。

以下是一个常见的错误示例:

function mistake(arr) {
   arr = [1, 2, 3];
   console.log(arr); // 输出 Array [ 1, 2, 3 ]
}

var arr = [4, 5, 6];
mistake(arr);
console.log(arr); // 输出 Array [ 4, 5, 6 ]

在这个例子中,arr是原始的数组变量,并且在函数mistake中使用值传递。在函数中,我们重新分配了一个新数组,并将其分配给参数arr,但这不影响原始的数组变量。

因此,在处理对象和数组等具有对象值的变量时,应该总是使用引用传递,以便在函数内外都能正确处理变量。在处理原始值时,应该总是使用值传递。

总结

Javascript中有两种不同的变量传递方法,值传递和引用传递。对于具有原始值的变量应该使用值传递,对于具有对象值的变量应该使用引用传递。但是,由于引用传递可能会对其他变量产生意外的影响,因此在传递具有对象值的变量时,应该特别小心。