为什么这两个空数组的数组填充方式不同?

时间:2017-06-24 11:21:29

标签: javascript arrays

我有这个代码。我甚至把console.logs调试了。但我真的不明白他们为什么会以不同的方式行事。为什么result1数组用最后一个数组值填充所有内部数组?



var myMatrix = [
  [0, 1, 2, 3],
  [4, 5, 6, 7],
  [8, 9, 10, 11],
  [12, 13, 14, 15]
];

function rotateMatrixClockwise(matrix) {
  var long = matrix.length;
  var result1 = new Array(long).fill([]);
  var result2 = [ [], [], [], [] ];
  console.log("Empty result1:");
  console.log(result1);
  console.log("Empty result2:");
  console.log(result2);
  for (var row = 0; row < long; row++) {
    for (var col = 0; col < long; col++) {
      result1[row][col] = matrix[long - col - 1][row];
      result2[row][col] = matrix[long - col - 1][row];
    }
  }
  console.log("Result1:");
  console.log(result1);
  console.log("Result2:");
  console.log(result2);
}

rotateMatrixClockwise(myMatrix);
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:2)

您正在使用

中相同的数组对象引用填充数组
var result1 = new Array(long).fill([]);
//                                 ^^ same array for all elements

以后的任何作业都会在同一个数组中进行。

在工作版中,

var result2 = [[], [], [], []];
//             ^^  ^^  ^^  ^^  four different arrays

你需要四个不同的数组,它们没有引用同一个数组。

Array.fill的引用说明了静态行为,而Javascript则通过引用移交了对象。

  

fill() 方法使用静态值将数组的所有元素从起始索引填充到结束索引。

var myMatrix = [
  [0, 1, 2, 3],
  [4, 5, 6, 7],
  [8, 9, 10, 11],
  [12, 13, 14, 15]
];

function rotateMatrixClockwise(matrix) {
  var array = [];
  var long = matrix.length;
  var result1 = new Array(long).fill(array);
  var result2 = [[], [], [], []];
  console.log("Empty result1:");
  console.log(result1);
  console.log("Empty result2:");
  console.log(result2);
  for (var row = 0; row < long; row++) {
    for (var col = 0; col < long; col++) {
      result1[row][col] = matrix[long - col - 1][row];
      result2[row][col] = matrix[long - col - 1][row];
    }
  }
  console.log("Result1:");
  console.log(result1);
  console.log("Result2:");
  console.log(result2);
  console.log('array', array);
}

rotateMatrixClockwise(myMatrix)