Когда я использую Array.fill заполнить многомерный массив, я получаю странное поведение при нажатии на одну из массивов:Weird поведения в Array.fill
var arr = Array(2).fill([]);
arr[0].push(5);
console.log(arr);
//=> prints [[5], [5]]
Когда я использую Array.fill заполнить многомерный массив, я получаю странное поведение при нажатии на одну из массивов:Weird поведения в Array.fill
var arr = Array(2).fill([]);
arr[0].push(5);
console.log(arr);
//=> prints [[5], [5]]
fill
по существу делает это:
var content = [];
for (var i = 0; i < 2; i += 1) {
arr[i] = content;
}
Таким образом, ваш массив будет иметь ссылку на массив вы перешли к fill
в каждой собственности.
Это звучит странно, но то, что ваш код на самом деле does создает массив ([]
) и помещает ссылку для этого массива в каждый из элементов Array(2)
. Поэтому всякий раз, когда вы меняете эту ссылку, каждый массив, на который ссылается этот массив, изменяется.
Это точно так же, как:
var a = [];
var arr = Array(2).fill(a);
a.push(5);
console.log(arr[0][0], arr[1][0]);
a[0] = 2;
console.log(arr[0][0], arr[1][0]);
Вы можете видеть, что значения внутри arr
зависят от изменений в a
массива.
оба эти ответы - отличные примеры того, почему вы должны узнать об объектах и как они работают. Сеть разработчиков mozilla станет хорошим началом для изучения этого. tbh вы могли бы даже сделать это: 'var a = {}; (Функция (х) {a.foo = "бар"}) (а); console.log (a.foo) ' – GottZ