在JavaScript函数之后保留原始数组

Keep original array after JavaScript function

本问题已经有最佳答案,请猛点这里访问。

我相信有一个简单的答案,虽然我对PHP只有真正的经验。当我将"比萨"数组传递给我的"比萨"函数时,"比萨"数组为什么会发生变化,并且只对"比萨"进行更改?如何将传递给函数的原始数组保留在函数之外?一旦函数运行完毕,批萨数组就不应该更改。我注意到,如果我更改字符串变量(pie),它在函数运行后将保持不变,与数组不同。

简而言之,我希望第一组结果与第二组结果相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
var pizza = [];
pizza.push('crust');
pizza.push('ham');

var pie ="apple"

function bake_goods(my_pizza, my_pie){
    console.log(my_pizza);
    console.log(my_pie);

    delete my_pizza['1'];
    my_pie ="peach";

    console.log(my_pizza);
    console.log(my_pie);
}

//first run

bake_goods(pizza, pie);
//console logs
//['crust','ham']
//apple

//['crust']
//peach

//second run

bake_goods(pizza, pie);
//console logs
//['crust']
//apple

//['crust']
//peach


应该在函数中克隆(创建)数组

1
2
3
4
5
6
7
8
9
10
11
function bake_goods(my_pizza, my_pie){
    var innerPizza = my_pizza.slice(0);
    console.log(innerPizza);
    console.log(my_pie);

    delete innerPizza ['1'];
    my_pie ="peach";

    console.log(innerPizza );
    console.log(my_pie);
}

数组和对象作为指向原始对象的指针传递。如果不想修改原件,则需要先制作一份副本。

1
2
3
4
function bake_goods(my_pizza, my_pie) {
    my_pizza = my_pizza.slice(0);
    delete my_pizza[1];
}


使用它,可以强制javascript在本地上下文而不是全局上下文中编辑对象,还需要克隆对象。

1
2
3
4
5
6
7
8
9
10
11
12
function bake_goods(my_pizza, my_pie){
    this.my_pizza = my_pizza.slice(0);

    console.log(this.my_pizza);
    console.log(this.my_pie);

    delete this.my_pizza['1'];
    this.my_pie ="peach";

    console.log(this.my_pizza);
    console.log(this.my_pie);
}

"pizza"数组会更改,因为函数显然是通过引用调用的。函数通过在内存中初始化函数外部变量的相同位置来操作参数。您可以通过创建我的披萨阵列及其元素的副本并使用它来避免这些不需要的更改。