2016-12-02 3 views
3

Когда я использую Array.fill заполнить многомерный массив, я получаю странное поведение при нажатии на одну из массивов:Weird поведения в Array.fill

var arr = Array(2).fill([]); 
arr[0].push(5); 
console.log(arr); 
//=> prints [[5], [5]] 
+0

оба эти ответы - отличные примеры того, почему вы должны узнать об объектах и ​​как они работают. Сеть разработчиков mozilla станет хорошим началом для изучения этого. tbh вы могли бы даже сделать это: 'var a = {}; (Функция (х) {a.foo = "бар"}) (а); console.log (a.foo) ' – GottZ

ответ

4

fill по существу делает это:

var content = []; 
for (var i = 0; i < 2; i += 1) { 
    arr[i] = content; 
} 

Таким образом, ваш массив будет иметь ссылку на массив вы перешли к fill в каждой собственности.

2

Это звучит странно, но то, что ваш код на самом деле 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 массива.

Смежные вопросы