7

我确信对此有一个简单的答案,尽管我只有 PHP 方面的经验。为什么当我将“pizza”数组作为“my_pizza”传递给我的函数并且只对“my_pizza”进行更改时,它会发生变化?如何将我传递给函数的原始数组保留在函数之外?一旦函数完成运行,披萨数组应该不会改变。我注意到如果我更改我的字符串变量(pie),它会在函数运行后保持不变,这与数组不同。

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

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
4

4 回答 4

7

你应该在你的函数中克隆(创建一个副本)你的数组

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);
}
于 2013-10-03T21:55:55.170 回答
2

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

function bake_goods(my_pizza, my_pie) {
    my_pizza = my_pizza.slice(0);
    delete my_pizza[1];
}
于 2013-10-03T21:56:04.393 回答
0

“pizza”数组发生了变化,因为该函数显然是通过引用调用的。该函数通过函数外部变量在其中初始化的内存中的相同位置操作参数。您可以通过创建 my_pizza 数组及其元素的副本并使用它来避免这些不必要的更改。

于 2013-10-03T21:59:11.273 回答
0

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

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);
}
于 2013-10-03T22:02:20.720 回答