如何在 JavaScript 中交换二维数组中的两个元素? (对我从 console.log 在 Chrome 中看到的内容感到困惑)

How to swap two elements inside of a 2D Array in JavaScript? (Confused about what I’m seeing from console.log in Chrome)

我想交换一个二维数组中的两个数组,但是 JS 似乎在我实际交换发生之前就已经这样做了。

这是我正在研究的算法,提供了显示点列表的各种可能方式。我已经尝试了几种方法来做到这一点,但关键问题不断出现,我设法将其归结为这段代码:

var points = [[1,2],[10,20],[100,200]];
console.log(points);
var a = points[1][0];
var b = points[1][1];
points[1][0] = points[2][0];
points[1][1] = points[2][1];
points[2][0] = a;
points[2][1] = b;
console.log(points);

我知道这段代码并不接近 DRY,但它有同样的问题:'points' 在声明后被记录到控制台行中,尽管在该日志中,它已经被交换?这怎么可能,因为还没有命令说要这样做。 JavaScript 如何处理代码的和平?为什么我的似乎不起作用?

**第一个日志的预期输出是:[[1,2],[10,20],[100,200]] **对于第二个日志:[[1,2],[100,200],[10,20]]

Whosebug 按预期运行它,但 Chrome 以不同的方式运行它

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

但是当你点击展开它来查看数组内部时,项目被交换了:

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

运行 你的确切算法与 console.log(points.toString()) 相反,我看到这个(再次在 Firefox 中):

仅出于演示目的,以下是如何使用解构赋值来简化代码以完成相同的操作:

var points = [[1, 2], [10, 20], [100, 200]];
console.log(points.toString());
[points[1], points[2]] = [points[2], points[1]];
console.log(points.toString());

p.s.w.g 是正确的,这与 Chrome 对诸如 console.log 之类的数组的惰性求值有关。详情如下:Is Chrome's JavaScript console lazy about evaluating arrays?