Javascript的右手值会在循环中自行更改吗?

Javascript's right-hand value changes itself in a loop?

我在WebGL中编写了一个动画3D眼睛的代码。我不明白的是为什么JavaScript中的右值可以在循环中更改。以下是部分代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function start() {
    ...
    if (GL) {
        ...
        tick();                       // For animation
    }
}

function tick() {
    requestAnimationFrame(tick);
    updateTime();
    drawScene();
}

function updateTime() {
    curTime = (new Date).getTime();
    if (lastTime) {                                 // Initial value: lastTime = 0
        var delta = curTime - lastTime;
        eyeFrame = Math.round((delta%60000)/20);    // Initial value: eyeFrame = 0
    } else {
        lastTime = curTime;
    }
}

function drawScene() {
    updateBuffers(eyeFrame);
    ...
}

function updateBuffers(idx) {
    curV = V;                         // V is the 3D coordinates, must not change
    for (i=0; i<2; i++) {
        for (j=0; j<329; j++) {
            curV[i][3*j] += (xEyes[i][4*j]*eyeMov[idx][0]+xEyes[i][4*j+1]*eyeMov[idx][1]+xEyes[i][4*j+2]*eyeMov[idx][2]+xEyes[i][4*j+3]*eyeMov[idx][3]);
            curV[i][3*j+1] += (yEyes[i][4*j]*eyeMov[idx][0]+yEyes[i][4*j+1]*eyeMov[idx][1]+yEyes[i][4*j+2]*eyeMov[idx][2]+yEyes[i][4*j+3]*eyeMov[idx][3]);
            curV[i][3*j+2] += (zEyes[i][4*j]*eyeMov[idx][0]+zEyes[i][4*j+1]*eyeMov[idx][1]+zEyes[i][4*j+2]*eyeMov[idx][2]+zEyes[i][4*j+3]*eyeMov[idx][3]);
        }
    }
    ...
}

从文件中读取VxEyesyEyeszEyeseyeMov的值。我遇到的问题是,从第二次访问updateBuffers()起,V的价值发生了变化。但在代码中,V不在方程的左边。有什么建议如何解决这个问题吗?


在javascript中使用=复制数组总是通过引用。要按值复制数组,应使用方法slice(),如本页所示:创建多维数组的副本,而不是引用-javascript。


将旧数组的每个属性复制到for循环中的某个新数组

1
2
3
4
    var curV = [];
    for (var i=0, vl = V.length; i<vl ; i+=1) {
        curV[i] = V[i];
    }

如果需要经常这样做,请将其归纳为一个函数,该函数将返回数组的副本。您也可以使用slice方法,如下所述。

Javascript知道两种日期类型——基元类型(字符串、布尔值、数字、未定义、空值)和引用类型(对象)。基元类型"保留"其值,引用类型只是指向内存中其他位置的"指针"。使用基本体时,使用(常量大小)值;使用引用时,使用指针(因为对象大小可能会变化)。

这就是为什么不能直接复制数组的原因。因为你只复制指针,而不是值。

slice and for loop copy返回shallow copy-任何引用类型都将再次被引用。