Javascript 的右手值在循环中改变自身?

标签 javascript

我写了一段代码来在 WebGL 中制作 3D 眼睛动画。我不明白的是为什么 Javascript 中的右手值可以在循环中改变。以下是部分代码:

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。有什么解决方法的建议吗?

最佳答案

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

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

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

Javascript 知道两种日期类型——基本类型(字符串、 bool 值、数字、未定义、空值)和引用类型(对象)。原始类型“保留”它们的值,引用类型只是指向内存中其他地方的“指针”。当您使用基元时,您使用的是(恒定大小)值,当您使用引用时,您使用的是指针(因为对象大小可能会有所不同)。

也就是为什么不能直接复制数组。因为您只复制指针,而不是值。

Slice 和 for 循环复制返回浅拷贝 - 任何引用类型都将再次被引用。

关于Javascript 的右手值在循环中改变自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18826459/

相关文章:

php - 当用另一个文本框写入时更改一个文本框的文本

javascript - 子资源完整性对内联 JavaScript 有用吗?

javascript - 如何在控制台中以表格格式显示多维Javascript数组?

javascript - 使用 jQuery 删除类时,将该类包含在选择器中是否更好?

javascript - 为什么 (true && {}) 的计算结果为 {},而 ({} && true) 的计算结果为 true?

javascript - 获取键值等于数组值的对象

javascript - 无法处理其他 promise 中的 promise 失败

javascript - 隐藏 jquery 表单向导第一页上的 'back' 按钮的最佳方法是什么?

javascript - ASP.Net 中下拉框的数据绑定(bind)

javascript - 替换 Javascript 构造函数的 .prototype 而不是添加它有问题吗?