Как я могу сохранить ссылку на переменную в массиве?

#javascript

#javascript

Вопрос:

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

 var name = "foo";
var array = [];

array["reference"] = name;

name = "bar";

// Still returns "foo" when I'd like it to return "bar."
array["reference"];
  

Есть ли способ заставить массив ссылаться на переменную?

Ответ №1:

Вместо этого поместите объект в массив:

 var name = {};
name.title = "foo";

var array = [];

array["reference"] = name;

name.title = "bar";

// now returns "bar"
array["reference"].title;
  

Ответ №2:

Вы не можете.

JavaScript всегда передает по значению. И все является объектом; var хранит указатель, следовательно, он передается по значению указателя.

Если ваш name = "bar" должен находиться внутри функции, вам нужно будет передать вместо этого весь массив. Затем функции нужно будет изменить ее с помощью array["reference"] = "bar" .

Кстати, [] это литерал массива. {} является объектным литералом. Это array["reference"] работает, потому что массив также является объектом, но доступ к массиву должен осуществляться по индексу, основанному на 0. Вы, вероятно, захотите использовать {} вместо этого.

И foo["bar"] эквивалентно foo.bar . Более длинный синтаксис более полезен, если ключ может быть динамическим, например, foo[bar] , что совсем не совпадает с foo.bar (или если вы хотите использовать минимайзер, подобный компилятору закрытия Google).

Комментарии:

1. Это ответ, который я искал. Я понимаю, что объекты могут использоваться для аналогичного эффекта, но этот ответ затрагивает суть проблемы.

2. Javascript не всегда передает значение … например. если у вас есть abc = {a:2}; и затем ddd=abc; . У вас нет двух объектов. ddd сохраняет ссылку на abc. И если вы что-то измените в ddd, это изменится и в abc. Которая не передается по значению.

3. Это не должно быть принятым ответом. Вы можете сохранить ссылку на объект в JavaScript, как сказал Мухаммед Умер.

4. @RichN Я не имел в виду случай OP, мой пример не имел ничего общего с OP — он должен был продемонстрировать, что две переменные могут ссылаться на один и тот же объект в JS, что возможно только при передаче по ссылке. Этот связанный пост stack overflow также просто неверен: это они играют в глупую семантическую игру. Передача по ссылке означает передачу указателя. Утверждение, что она передает значение указателя, является просто бессвязной игрой слов. Ссылка = Передача по указателю. Если вы в это не верите, то передача по ссылке не имеет никакого значения в программировании. C и C были моими первыми языками…

5. Это действительно поражает мой разум, любой бы законно утверждал, что C не имеет передачи по ссылке — это некогерентно. PassByReference был термином, изобретенным для описания передачи переменной ячейки памяти в качестве переменной, а не самого значения данных. В C вы обозначаете переменную либо как указатель, либо без него с помощью *, когда вы передаете указатель вместо обычной переменной данных, которая передается по ссылке, указатель является ссылкой на интересующий объект. Это единственное полезное значение термина передача по ссылке. Технически это все еще просто «Значение», но так же, как и любой другой параметр в программировании

Ответ №3:

Попробуйте вместо этого поместить объект в массив и изменить значения внутри него.

 var ar = [];

var obj = {value: 10};
ar[ar.length] = obj;

obj.value = 12;

alert(ar[0].value);
  

Ответ №4:

Мое решение сохранить ссылку — передать вместо нее функцию:

Если вызывается переменная, на которую вы хотите сослаться myTarget , то используйте:

 myRef = function (newVal) {
    if (newVal != undefined) myTarget = newVal;
    return myTarget;
}
  

Чтобы прочитать значение, используйте myRef(); . Чтобы задать значение, используйте myRef(<the value you want to set>); .

Кстати, вы также можете назначить это элементу массива:

 var myArray = [myRef];
  

Затем используйте myArray[0]() для чтения и myArray[0](<new value>) для записи.

Отказ от ответственности: я тестировал это только с числовым целевым значением, поскольку это мой вариант использования.

Ответ №5:

Мое решение сохранить ссылку — передать вместо нее функцию:

Если переменная, на которую вы хотите сослаться, называется ‘myTarget’, то используйте:

 myRef = function (newVal) {
            if (newVal != undefined)
                myTarget = newVal;
            return myTarget;
        }
  

Чтобы прочитать значение, используйте myRef(); . Чтобы задать значение, используйте myRef(value_to_set);.

Кстати, вы также можете назначить это элементу массива:

 var myArray = [myRef];
  

Затем используйте myArray0 для чтения и myArray[0](value_to_set) для записи.

Отказ от ответственности: я тестировал это только с числовым целевым значением, поскольку это мой вариант использования.