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

标签 javascript arrays google-chrome lazy-evaluation console.log

我想交换一个二维数组中的两个数组,但是 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]]

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

最佳答案

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

initial console

但是当您单击展开它以查看数组内部时,项目被交换了:

expanded console

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

改为使用 console.log(points.toString()) 运行您的精确算法,我看到了这个(再次在 Firefox 中):

toString demo

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

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

关于javascript - 如何在 JavaScript 中交换二维数组中的两个元素? (对我从 Chrome 中的 console.log 看到的内容感到困惑),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54697152/

相关文章:

C++ 二维数组 : Each element is given a number but output is a different number

javascript - Chrome 中的网络推送通知

javascript - HTML CSS JS,在javascript中添加类似乎不起作用

javascript - 如何测试嵌套模拟函数

javascript - 通过脚本注入(inject)进行远程控制

Javascript 闭包 : Memory Leak

css - 最新版本的 chrome(16.0.912.77)改变了它对待 CSS 绝对定位的方式?

javascript - 如何仅在 URL 加载后调用 revokeObjectURL?

javascript - 在 Javascript 中查找模式

javascript - 是否可以删除函数的一部分? (即满足条件时的特定变量)