Javascript 2D数组的意外行为

Javascript 2D数组的意外行为,javascript,arrays,undefined-behavior,Javascript,Arrays,Undefined Behavior,我目前正在使用Javascript进行开发,遇到了一个无法解决的问题。我想说,我在编程方面很有经验,但像这样的事情以前从未发生过,我无法通过朋友或互联网解决它 在下面的代码中,我创建了一个简单的2D数组,并用0.1填充每个位置。然后我记录数组,修改它并再次记录它。您期望的输出是什么?我希望它记录一个填充了许多0.1的数组,并记录另一个填充了许多0.1的数组,在位置1,2,它应该是100 但真正的结果是两个相似的阵列。当我在编辑数组的地方注释行时,它变得更加奇怪。然后,输出数组仍然相同,但没有修改

我目前正在使用Javascript进行开发,遇到了一个无法解决的问题。我想说,我在编程方面很有经验,但像这样的事情以前从未发生过,我无法通过朋友或互联网解决它

在下面的代码中,我创建了一个简单的2D数组,并用0.1填充每个位置。然后我记录数组,修改它并再次记录它。您期望的输出是什么?我希望它记录一个填充了许多0.1的数组,并记录另一个填充了许多0.1的数组,在位置1,2,它应该是100

但真正的结果是两个相似的阵列。当我在编辑数组的地方注释行时,它变得更加奇怪。然后,输出数组仍然相同,但没有修改。 因此,第一个日志取决于它之后执行的代码。我觉得这很奇怪。我还试着将修改操作行设置为1秒超时。同样的结果

提前谢谢你的帮助

let test=[];
for(设xx=0;xx<2;xx++){
测试推送([]);
for(设yy=0;yy<6;yy++){
试验[xx]。推送(0.1);
}
}
控制台日志(测试);
试验[1][2]=100;

控制台日志(测试)每当您执行
console.log(someObject)
时,浏览器都会输出对象的实时视图;这意味着您对该对象所做的任何更改都会更新控制台输出

而是使用
JSON.stringify(someObject)
序列化对象,然后使用
console.log
将其序列化。这将在序列化时为您提供该对象的快照。但是您必须小心,
someObject
可能有循环引用,并且很少有其他gotcha,这会在序列化过程中产生问题


请参见

查看问题中编辑的片段。您的代码运行良好

如果您在浏览器的控制台上看到两次相同的阵列,那是因为浏览器的开发工具是如何工作的。执行
console.log(test)
时,数组不会打印到控制台,它们的引用会打印在那里。然后“展开”数组的内容。因为您记录了两次相同的引用,所以它们指向相同的值

如果您记录的是
console.log(test.toString())
,您会看到两个记录的值是不同的

例如,在Chrome上:

展开前:

展开后:


console.log
将具有不同的异步/同步行为

有关更多信息:

您可以使用promises或async/await实现不同的输出

let test=[];
for(设xx=0;xx<2;xx++){
测试推送([]);
for(设yy=0;yy<6;yy++){
试验[xx]。推送(0.1);
}
}
Promise.resolve(console.log(test))。然后(()=>{
试验[1][2]=100;
}).然后(()=>{
控制台日志(测试);

})
我可以在问题本身中看到它的两个不同数组。运行代码段,您将获得两个不同的arraysJeah,但在Chrome或Safari中并非如此