为什么console.log(array)不能提供与console.log({array})相同的结果?

时间:2019-11-09 16:35:18

标签: javascript arrays object console.log

在实现冒泡排序算法时,我注意到在对象中记录数组与直接记录数组产生不同的结果。为什么?

function bubbleSort(arr) {
  let array = [...arr];
  let sorted = false;
  let round = 0;

  while (!sorted) {

    sorted = true;
    console.log({ array }); // this shows the already sorted array
    console.log(array); // this shows the array after one round of sorting

    for (let i = 0; i < array.length - 1 - round; i++) {
      if (array[i] > array[i + 1]) {
        [array[i], array[i + 1]] = [array[i + 1], array[i]];
        sorted = false;
      }
    }
    round++;
  }
  return array;
}

bubbleSort([1,4,6,3,45,78,9])

2 个答案:

答案 0 :(得分:1)

您的声明无效。

此代码显示console.log都在每一轮中打印相同的数组。

function bubbleSort(arr) {
  let array = [...arr];
  let sorted = false;
  let round = 0;

  while (!sorted) {

    sorted = true;
    console.log({ array }, `Round no. ${round}`); // this shows the already sorted array
    console.log(array, `Round no. ${round}`); // this shows the array after one round of sorting

    for (let i = 0; i < array.length - 1 - round; i++) {
      if (array[i] > array[i + 1]) {
        [array[i], array[i + 1]] = [array[i + 1], array[i]];
        sorted = false;
      }
    }
    round++;
  }
  return array;
}

bubbleSort([10,7,15,1]);

这是我执行此代码段时得到的

{
  "array": [
    10,
    7,
    15,
    1
  ]
} Round no. 0
[
  10,
  7,
  15,
  1
] Round no. 0
{
  "array": [
    7,
    10,
    1,
    15
  ]
} Round no. 1
[
  7,
  10,
  1,
  15
] Round no. 1
{
  "array": [
    7,
    1,
    10,
    15
  ]
} Round no. 2
[
  7,
  1,
  10,
  15
] Round no. 2
{
  "array": [
    1,
    7,
    10,
    15
  ]
} Round no. 3
[
  1,
  7,
  10,
  15
] Round no. 3

PS:如果您是说要在Chrome控制台(或类似的控制台)中打开它,并且看起来像console,则取决于该控制台的实现。

array{ array }的值都是在内存中保留数组值的位置。这些值正在变化,因此,如果它没有在您记录日志时保留数组的值,而是存储段的值,那么在扩展它时,它会显示当前值,而不是历史值。 / p>

答案 1 :(得分:1)

也许一个简单的例子会更清楚:

在控制台中输入以下内容:

const arr = [1, 2, 3]; const obj = {arr}; console.log(obj)
不要打开对象

现在的类型:
arr[0] = 11;
...然后从上面的行中打开对象。它应显示为[11,2,3],因为当您在控制台中打开对象时,它会显示{arr}当时的状态,而不是记录时的状态。