我确信这有一个简单的答案,尽管我只有PHP的经验。为什么“披萨”阵列在我将其传递给我的“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
答案 0 :(得分:6)
你应该在你的函数中克隆(创建一个副本)
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)
数组和对象作为指向原始对象的指针传递。如果您不想修改原件,则需要先制作副本。
function bake_goods(my_pizza, my_pie) {
my_pizza = my_pizza.slice(0);
delete my_pizza[1];
}
答案 2 :(得分:0)
“pizza”数组发生了变化,因为该函数显然是通过引用调用的。该函数通过内存中与函数外部变量初始化的位置相同的位置来操作参数。您可以通过创建my_pizza数组及其元素的副本并使用它来避免这些不必要的更改。
答案 3 :(得分: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);
}