В чем разница между этими способами создания двумерного массива?

117
01 ноября 2019, 07:50

Как объяснить то, что массив arr1 так странно реагирует на замену элемента?

    let arr1 = new Array(3); 
    arr1.fill(new Array(3).fill(false)); 
 
    let arr2 = []; 
    for (let i = 0; i < 3; i++) { 
    	arr2[i] = []; 
    	for (let k = 0; k < 3; k++) { 
    		arr2[i][k] = false; 
    	} 
    } 
     
     
    arr1[1][1] = true; 
    arr2[1][1] = true; 
     
    console.log(arr1,arr2);	

Answer 1

Второй массив состоит из девяти независимых элементов. Первый массив состоит из трех копий одного массива. Изменение любого элемента ведет к изменениях других двух копиях.

Нажмите на кнопку "Выполнить код" в вопросе. Увидите, что первый массив выглядит так:

[
  [
    /**id:2**/
    false,
    true,
    false
  ],
  /**ref:2**/,
  /**ref:2**/
]

Один массив и две ссылки на него.

Answer 2

Один из способов пофиксить.

let arr1 = new Array(3); 
arr1 = arr1.fill(() => new Array(3).fill(false)).map(m => m()); 
 
let arr2 = []; 
for (let i = 0; i < 3; i++) { 
  arr2[i] = []; 
  for (let k = 0; k < 3; k++) { 
    arr2[i][k] = false; 
  } 
} 
 
 
arr1[1][1] = true; 
arr2[1][1] = true; 
 
console.log(arr1, arr2);

Answer 3

Массивы и объекты в JavaScript передаются по ссылке, в отличие от примитивов. Это значит, что работая с объектом, и присваивая значение одной переменной другой, вы копируете не значение ("такой же объект"), а ссылку ("этот же объект"). Что приводит к такому поведению:

{} !== {} // Это, хоть и одинаковые объекты, но не "один и тот же"
let object = {
  foo: "bar"
};
let newObject = object; // Мы создаем новую ссылку на тот же объект
newObject.foo = "baz";
object.foo === "baz";
READ ALSO
Преобразования для примитивов [дубликат]

Преобразования для примитивов [дубликат]

На данный вопрос уже ответили:

117
Редактирование таблицы React

Редактирование таблицы React

Возникла следующая ситуация, мне необходимо выполнить операцию редактирования полей в таблицеДелаю я это следующим образом:

116
Как взять текст из элимента &lt;div&gt; и при этом не получить лишние теги?

Как взять текст из элимента <div> и при этом не получить лишние теги?

Как при нажатии Enter не получить лишние теги? Как у соцсети В контакте если не введено не чего то поле ввода остается пустым сообщение не добавляется!!!...

104