Javascript P5.js draw()函数以错误的顺序执行循环

Javascript P5.js draw()函数以错误的顺序执行循环,javascript,html,p5.js,Javascript,Html,P5.js,所以我一直在绞尽脑汁为什么这几个小时都不管用。。。我试图实现的实际上是通过2D数组“传播”行。基本上,数组的第一行设置为随机值,然后将该行复制到第二行,第一行再次填充随机值-重复此操作直到该行到达数组的末尾。下面是一个直观的示例: [0, 0, 0] [1, 1, 1] [2, 2, 2] | [3, 7, 2] [0, 0, 0] [1, 1, 1] | [5, 6, 8] [3, 7, 2] [0, 0, 0] | And so on... 在Python中,我可以

所以我一直在绞尽脑汁为什么这几个小时都不管用。。。我试图实现的实际上是通过2D数组“传播”行。基本上,数组的第一行设置为随机值,然后将该行复制到第二行,第一行再次填充随机值-重复此操作直到该行到达数组的末尾。下面是一个直观的示例:

[0, 0, 0]
[1, 1, 1]
[2, 2, 2]
    |
[3, 7, 2]
[0, 0, 0]
[1, 1, 1]
    |
[5, 6, 8]
[3, 7, 2]
[0, 0, 0]
    |
And so on...
在Python中,我可以很容易地做到这一点,在将新值注入第0行之前,创建一个与原始数组相等的临时数组。然后,将数组的每一行设置为临时数组的当前索引-1,有效地将每一行上移一行

然而,在JavaScript中,特别是在p5js中,我似乎根本无法让它工作。在draw()函数中执行for循环时,就好像所有操作都是异步完成的,或者没有按照我期望的顺序执行。这是我的密码:

var arr = [], temp = [];

function setup() {
  noLoop();
  arr[0] = [0,0,0];
  arr[1] = [1,1,1];
  arr[2] = [2,2,2];

}

function draw(){
    for(let k = 0; k < 3; k++){
      temp[k] = arr[k];
    }
    console.table(arr);

    for(let i = 0; i < 3; i++){
       arr[0][i] = random(10)
    }
    console.table(arr);

    arr[1] = temp[0];
    arr[2] = temp[1];
    console.table(arr);
}
var arr=[],temp=[];
函数设置(){
noLoop();
arr[0]=[0,0,0];
arr[1]=[1,1,1];
arr[2]=[2,2,2];
}
函数绘图(){
for(设k=0;k<3;k++){
温度[k]=arr[k];
}
控制台.工作台(arr);
for(设i=0;i<3;i++){
arr[0][i]=随机(10)
}
控制台.工作台(arr);
arr[1]=温度[0];
arr[2]=温度[1];
控制台.工作台(arr);
}
我知道我可以使用更多的for循环,但是现在我使用了一些单独的索引来使它更基本

注意console.table(arr)语句的位置——我的印象是,这段代码按照我编写它的顺序执行,但是每个console语句都生成相同的表,就好像所有代码都是在写入控制台之前运行的一样。此外,即使我在以任何方式修改arr之前将temp设置为arr,temp也会在设置随机值之后被分配arr的值

当连续循环时,这会产生和数组填充相同的随机数,因为它依赖于临时存储未修改版本的arr

也许我在这里遗漏了一些明显的东西,或者我只是不知道JavaScript/p5.js是如何工作的,但是任何帮助都将不胜感激


谢谢:)。

temp[k]=arr[k]
通过引用复制数组对象,这意味着修改一个子数组将修改另一个子数组,因此
arr[0][i]=random(10)
修改两个数组中的两个内容。这可以通过首先执行
arr[0]=[]来修复。(如果我没有弄错的话,这与Python中的相同)

在常规JS中,
console.log
,以及其他日志功能,不会立即获取对象的内容,而是获取需要显示的部分,实际上只显示对象的最后状态。chrome开发工具应该会显示一个关于这一点的小提示

一个更好、更有效的方法是

let temp = [];
for (let i = 0; i < 3; i++) temp.push(random(10));
arr.unshift(temp);
arr.pop();
let temp=[];
对于(设i=0;i<3;i++)温度推送(随机(10));
取消移位(温度);
arr.pop();

非常感谢您的支持,我将研究这些数组函数以完全了解发生了什么。。。我真的不知道JS到底是怎么工作的!