Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript函数之后保留原始数组_Javascript_Arrays - Fatal编程技术网

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

在JavaScript函数之后保留原始数组,javascript,arrays,Javascript,Arrays,我相信这有一个简单的答案,尽管我只有真正的PHP经验。为什么当我将“pizza”数组作为“my_pizza”传递给我的函数并只对“my_pizza”进行更改时,“pizza”数组会发生更改?如何保持传递到函数外部的函数的原始数组?函数运行完成后,pizza数组不应更改。我注意到,如果我更改字符串变量(pie),它将在函数运行后保持不变,这与数组不同 简而言之,我希望第一组结果与第二组结果相同 var pizza = []; pizza.push('crust'); pizza.push('ham

我相信这有一个简单的答案,尽管我只有真正的PHP经验。为什么当我将“pizza”数组作为“my_pizza”传递给我的函数并只对“my_pizza”进行更改时,“pizza”数组会发生更改?如何保持传递到函数外部的函数的原始数组?函数运行完成后,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
您应该在函数中克隆(创建)阵列

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()
调用。(这实际上不是有效的语法。)