我正在编写一些脚本,因此发生了下一个问题。
我有多种功能:
A
返回bool,B
和C
不返回任何内容。
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()
都会返回数组。
为什么不正确? (为什么数组不会改变?)
编辑:
thisFunctionChangesArrayInside
和thisAnotherFunctionChangesArrayInside
函数:
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]
答案 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]