JS函数中的引用数组

时间:2013-12-15 00:11:01

标签: javascript arrays function reference

我正在编写一些脚本,因此发生了下一个问题。 我有多种功能: A返回bool,BC不返回任何内容。

if (A(array1, array2, array3, int1, int2, int3, int4, bool)) {
        B(array1, array2, array3, int1, int2, int3, int4, bool);
    }

B看起来像:

B(array1, array2, array3, int1, int2, int3, int4, bool){
    C(array1, array2, array3, int1, int2, int3, int4, bool);
    someCode;
}

C看起来像:

C(array1, array2, array3, int1, int2, int3, int4, bool){
    array1 = thisFunctionChangesArrayInside(array1, some, parameters);
    array2 = thisAnotherFunctionChangesArrayInside(array2, some, parameters);
    someCode;
}

thisFunctionChangesArrayInside()thisAnotherFunctionChangesArrayInside()都会返回数组。

为什么不正确? (为什么数组不会改变?)

编辑:

thisFunctionChangesArrayInsidethisAnotherFunctionChangesArrayInside函数:

function nowaPozycjaKolor(kolor, x1, y1, x2, y2) {
    var pomocniczaKolor = new Array();       //tablica zupełnie pomocnicza
    for (var i = 0; i < 8; i++) {            //ona reprezentuje kolory
        pomocniczaKolor[i] = new Array();
        for (var j = 0; j < 8; j++) {
            pomocniczaKolor[i][j] = kolor[i][j];
        }
    }
    pomocniczaKolor[x2][y2] = pomocniczaKolor[x1][y1];
    pomocniczaKolor[x1][y1] = 0;
    return pomocniczaKolor;
}

function nowaPozycjaFigur(figury, x1, y1, x2, y2) {
    var pomocniczaFigur = new Array();       //tablica zupełnie pomocnicza
    for (var i = 0; i < 8; i++) {            //ona reprezentuje figury
        pomocniczaFigur[i] = new Array();
        for (var j = 0; j < 8; j++) {
            pomocniczaFigur[i][j] = figury[i][j];
        }
    }
    pomocniczaFigur[x2][y2] = pomocniczaFigur[x1][y1];
    pomocniczaFigur[x1][y1] = 0;
    return pomocniczaFigur;

}

解决方案就像我一样:

function nowaPozycjaKolor(kolor, x1, y1, x2, y2) {
    kolor[x2][y2] = kolor[x1][y1];
    kolor[x1][y1] = 0;
    return kolor;
}

function nowaPozycjaFigur(figury, x1, y1, x2, y2) {
    figury[x2][y2] = figury[x1][y1];
    figury[x1][y1] = 0;
    return figury;

}

这个几乎按照我的意愿运作:

function makeNewArray(x) {
        // make copy of array passed in
        var y = x.slice(0);
        // modify the copy
        y[3]=10;
        y[4]=20;
        return y;
    }

    function funkcja(a){
        a = makeNewArray(a);
    }

    var arr = [1,2,3];
    alert(arr);                 // [1,2,3]
    funkcja(arr);
    alert(arr);                 // [1,2,3]   
    alert(makeNewArray(arr));   // [1,2,3,10,20]
    alert(arr);                 // [1,2,3]
    arr = makeNewArray(arr);
    alert(arr);                 // [1,2,3,10,20]

解决:

function makeNewArray(x) {
    // make copy of array passed in
    var y = x.slice(0);
    // modify the copy
    y[3]=10;
    y[4]=20;
    return y;
}

function funkcja(a){
    for(var i=0;i<5;i++){
        a[i] = makeNewArray(a)[i];
        //alert(a[i]);
        }
}

var arr = [1,2,3,4,5];
alert(arr);                 // [1,2,3]
funkcja(arr);
alert(arr);                 // [1,2,3,10,20]   
alert(makeNewArray(arr));   // [1,2,3,10,20]
alert(arr);                 // [1,2,3,10,20]
arr = makeNewArray(arr);
alert(arr);                 // [1,2,3,10,20]

2 个答案:

答案 0 :(得分:0)

假设您发布的是伪代码,问题是C不会更改它传递的数组。相反,它为包含数组的变量分配新值,这是不同的。 JavaScript没有指针,数组引用按值传递(如果这看起来很混乱,请参阅Is JavaScript a pass-by-reference or pass-by-value language?)。

答案 1 :(得分:0)

如果希望更改作为参数传递的数组,则必须修改数组,而不是将参数变量赋值为其他内容。

将数组或对象作为函数参数传递会生成一个新变量(函数的一个参数),并将该变量放入原始数组或对象的ptr中。

因此,如果使用该参数修改数组或对象,则通过指向原始对象的指针修改原始数组或对象。但是如果为该参数分配一个新值,那么它只是一个现在指向另一个对象的变量。另一个变量没有改变,仍然指向原始对象,但新变量现在指向一个新对象,两个不再有任何共同点。

修改传递的数组:

var arr = [];
function modifyMyArray(x) {
   // change the array that was passed
   x.push(1);
}
modifyMyArray(arr);
console.log(arr.length);   // shows 1

将参数值指定为其他内容:

var arr = [];
function modifyMyArray(x) {
   // assign the argument variable to hold a different array
   // does not affect arr
   x = [1,2,3];
}
modifyMyArray(arr);
console.log(arr.length);   // shows 0

在函数之外,它的工作方式相同:

var arr = [1,2,3];
var x = arr;
console.log(x);    // shows [1,2,3] because x contains a ptr to the same array as arr
x = ["a", "b"];
console.log(arr);  // show [1,2,3] because x has just been assigned a different array
                   //    and arr was unaffected by that assignment

创建一个新数组并将其返回:

function makeNewArray(x) {
    // make copy of array passed in
    var y = x.slice(0);
    // modify the copy
    y.push(10);
    y.push(20);
    return y;
}

var arr = [1,2,3];
var z = makeNewArray(arr);
console.log(z);     // [1,2,3,10,20]