如何在JavaScript中交换2D数组中的两个元素?(对我在Chrome中从console.log看到的东西感到困惑)

如何在JavaScript中交换2D数组中的两个元素?(对我在Chrome中从console.log看到的东西感到困惑),javascript,arrays,google-chrome,lazy-evaluation,console.log,Javascript,Arrays,Google Chrome,Lazy Evaluation,Console.log,我想在一个2D数组中交换两个数组,但是JS似乎在我实际交换之前就这样做了 这是我正在研究的一个算法,提供了显示点列表的各种可能方式。我尝试了几种方法,但关键问题不断出现,我成功地将其归结为代码的和平: var点=[[1,2]、[10,20]、[100200]; 控制台日志(点); var a=点[1][0]; var b=点[1][1]; 分[1][0]=分[2][0]; 分[1][1]=分[2][1]; [2][0]=a分; [2][1]=b点; 控制台日志(点)我相信这里发生的事情是,控制

我想在一个2D数组中交换两个数组,但是JS似乎在我实际交换之前就这样做了

这是我正在研究的一个算法,提供了显示点列表的各种可能方式。我尝试了几种方法,但关键问题不断出现,我成功地将其归结为代码的和平:

var点=[[1,2]、[10,20]、[100200];
控制台日志(点);
var a=点[1][0];
var b=点[1][1];
分[1][0]=分[2][0];
分[1][1]=分[2][1];
[2][0]=a分;
[2][1]=b点;

控制台日志(点)我相信这里发生的事情是,控制台显示了如下内容(在Firefox中):

但是,如果单击展开以查看阵列内部,则项目将被交换:

这是因为控制台实际上向您显示了对数组的引用,并且由于您的算法在适当的位置修改了原始数组,当您单击展开控制台中的元素时,引用已被修改。您的代码很好,您可以尝试使用
.toString()
JSON.stringify
甚至
[…points]
来确保在每一行中向控制台输出的是不同的值,而不是对相同值的引用

使用
console.log(points.toString())
运行您的精确算法,我看到了这一点(同样在Firefox中):

仅出于演示目的,以下是如何简化代码,以便使用非结构化分配执行相同的操作:

var点=[[1,2]、[10,20]、[100200];
log(points.toString());
[点[1],点[2]]=[点[2],点[1]];

log(points.toString())p.s.w.g是正确的,这与Chrome对console.log之类的数组的惰性评估有关。这里有更多的细节:

我看不到你的代码有任何问题,我把你的代码放在
代码片段上,我看不到第二行被交换过……预期的结果是什么?我想这与console有关。登录Chrome:出于好奇,你用什么环境来重现这一点?另外,使用setTimeout来演示调用console.log后发生的更改可能会很有趣。@3ocene Firefox(我最初说的是Chrome,因为这是我通常使用的,但我刚刚意识到我使用的是Firefox ATM),但在Chrome中也会得到同样的结果。只需在开发工具打开的情况下运行OP的原始代码段,就可以复制它;我以为这是一个IDE。我决定自己在Chrome上试试,看看会发生什么。在展开console.log并将其更改为值之前,它看起来像是一个引用。使用setTimeout,如果在超时执行之前展开日志消息,它将显示初始值,即使在超时运行之后仍保持该值,如果在超时执行之后展开,则将获得第二个值。直到。非常感谢!使用.toString()实现所需的输出。我只是在代码中找不到错误。这可能更适合作为注释。那些只说别人是正确的答案不会比投票更重要。此外,最好在此处包含该链接的基本部分,并提供该链接以供参考,因为链接经常发生变化和中断。