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]); } } ... } |
从文件中读取
在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-任何引用类型都将再次被引用。