7

私はPHPの経験しかありませんが、これには簡単な答えがあると確信しています。"my_pizza" として関数に渡し、"my_pizza" のみを変更すると、"pizza" 配列が変更されるのはなぜですか? 関数の外で関数に渡す元の配列を保持するにはどうすればよいですか? 関数の実行が終了すると、ピザの配列は変更されていないはずです。文字列変数 (パイ) を変更すると、配列とは異なり、関数の実行後も同じままになることに気付きました。

要するに、最初の結果セットが 2 番目の結果セットと同じになるようにしたいのです。

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 に答える