在JavaScript函数之后保留原始数组
我相信这有一个简单的答案,尽管我只有真正的PHP经验。为什么当我将“pizza”数组作为“my_pizza”传递给我的函数并只对“my_pizza”进行更改时,“pizza”数组会发生更改?如何保持传递到函数外部的函数的原始数组?函数运行完成后,pizza数组不应更改。我注意到,如果我更改字符串变量(pie),它将在函数运行后保持不变,这与数组不同 简而言之,我希望第一组结果与第二组结果相同在JavaScript函数之后保留原始数组,javascript,arrays,Javascript,Arrays,我相信这有一个简单的答案,尽管我只有真正的PHP经验。为什么当我将“pizza”数组作为“my_pizza”传递给我的函数并只对“my_pizza”进行更改时,“pizza”数组会发生更改?如何保持传递到函数外部的函数的原始数组?函数运行完成后,pizza数组不应更改。我注意到,如果我更改字符串变量(pie),它将在函数运行后保持不变,这与数组不同 简而言之,我希望第一组结果与第二组结果相同 var pizza = []; pizza.push('crust'); pizza.push('ham
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
您应该在函数中克隆(创建)阵列
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);
}
数组和对象作为指向原始对象的指针传递。如果你不想修改原件,你需要先复制一份
function bake_goods(my_pizza, my_pie) {
my_pizza = my_pizza.slice(0);
delete my_pizza[1];
}
“pizza”数组发生更改,因为函数显然是通过引用调用的。函数通过与函数外部变量初始化位置相同的内存位置操纵参数。您可以通过创建my_pizza数组及其元素的副本并使用它来避免这些不必要的更改。使用此选项,强制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);
}
请参阅JavaScript中通过引用传递数组。如果希望原始数组不被修改,则需要复制数组并将其传递给函数(或让函数复制)。此外,从数组中删除元素的正确方法是,而不是
delete
。这是什么符号?我以前在javascript中没有见过这种情况。@recursive:这是一种表示Array.prototype.splice
的快捷方式,您实际上将其作为someArr.splice()
调用。(这实际上不是有效的语法。)