Создать ссылку на массив с индексом элемента вместо копии значения - PullRequest
2 голосов
/ 28 марта 2020

Кажется, что следующая инициализация b копирует данные массива из a вместо того, чтобы ссылаться на них, как предполагалось:

let a = [0,1];
let b = [a[0], 2];
a[0]=3;
console.log(b);

Вывод 0,2.

  • Почему вывод не 3,2?
  • Как можно b[0] инициализироваться ссылкой на a[0], чтобы она отражала изменения в a?
  • Если это невозможно, каковы альтернативы?
  • Есть ли для этого имя?

Ответы [ 4 ]

1 голос
/ 28 марта 2020

Нужно назначить по ссылке. Это означает, что переменная b хранит ссылку на переменную a, а переменная a хранит ссылку на массив [0, 1]. Это означает, что каждый раз, когда вы редактируете любую переменную a или b, массив [0, 1] будет изменен:

let a = [0,1];
let b = a;
a[0] = 3;
b[1] = 2;

Пример:

let a = [0,1];
let b = a;
a[0]=3;
b[1] = 2;
document.querySelector("div").innerText = b;
<div></div>

Значение по сравнению с эталонным

ОБНОВЛЕНИЕ:

Вы можете получить массив indexOf для редактирования, а затем просто отредактировать число по индексу:

let a = [0,1];
let b = [a[0], 2];
let index = b.indexOf(a[0]);
let valueToSet = 3;
a[0] = valueToSet;
b[index] = valueToSet;
console.log(`a is`, a);
console.log(`b is`, b);
0 голосов
/ 29 марта 2020

Примитивные значения, такие как числа, логические значения и строки, копируются по значению, поскольку они неизменны; и наоборот, объекты, массивы и функции копируются по ссылке.

См. также: Примитив

Это можно продемонстрировать на простом примере:

let a = [{foo: 0},{bar: 1}];
let b = [a[0], 2];
a[0].foo = 3;
console.log(b);

Если вы хотите копировать по ссылке, вам нужно скопировать весь массив, а не отдельные значения.

0 голосов
/ 29 марта 2020

Как и предполагалось,

let b = [a[0], 2];

инициализирует b копией числа в a вместо ссылки на него, поэтому более поздние изменения элемента не выполняются (автоматически ) отражено в b.

К сожалению, я не смог найти это поведение в справочных документах MDN JavaScript по адресу https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures. См. Ответ StepUp для ссылки на некоторую информацию.

Я все еще надеюсь, что может быть способ (может быть Указатели в JavaScript? ?).

В то же время простое определение переменной (переменных) («обновление», «переопределение») работает вокруг моей проблемы - это «лучше», чем копирование в оба массива только в том смысле, что это самый простой способ обновить число зависимых переменных:

let a = [0,1];
let b = [a[0], 2];
a[0]=3;
b = [a[0], 2];
console.log(b);  // [3,2]

Это минимальный случай, конечно, его можно заключить в функцию (return b;), чтобы упростить (пере) определение многих переменных.

0 голосов
/ 28 марта 2020

Копируется только значение, а не ссылка.

Технически, когда вы добавляете в массив b значение a[0], вы не копируете его ссылку, а просто значение. Поэтому позже, если вы измените элементы в массиве a, это не повлияет на значения массива b.

. Это работает точно так же, как использование переменной - использование elem ниже:

let a = [0,1];
let elem = a[0]; // value type, not copying the reference
let b = [elem, 2];
a[0]=3;
document.querySelector("div").innerText = b;
<div></div>

Надеюсь, это объясняет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...