JavaScript

函数内部对数组的修改会作用到外部?

很基础却又容易忽视的地方

Wenyuan
2021-03-31
2 min

当一个变量作为实参传入时,函数会复制这个变量作为形参,那么对形参的任何操作不会影响到函数外面作为实参的变量。
在JS中这对基本数据类型是没问题的,如果这个实参是引用类型,比如数组,虽然函数也复制了一个变量作为形参,但复制的变量存储的是地址,也就是说,函数内外(实参与形参)引用的是同一个数组,在函数内部当使用push等方法修改形参或其他相同引用值的变量时,函数外面数组也会被改变。

function fn(arr) {
    let arr1 = arr;
    arr1.push(3);
    return arr1;
}
let arr = [1, 2];
fn(arr)
console.log(arr); // [1,2,3]
1
2
3
4
5
6
7
8

不过把形参赋值为另一个数组的地址时arr=[],再进行push等修改就不会有影响了。所以,想要使内部对数组的修改不影响外部,可以使用slice或map复制一个新的数组,引用了不同的地址,怎么修改都不会影响到外面。

function fn(arr) {
    let arr1 = arr.slice();
    arr1.push(3);
    return arr1;
}
let arr = [1, 2];
fn(arr);
console.log(arr); // [1,2]
1
2
3
4
5
6
7
8