Есть ли способ для переменной действовать как ссылка на другую переменную? Могу ли я иметь переменную multiples, содержащую одну и ту же информацию относительно одного фрагмента данных?

Например:

var foo = "data";
var bar = foo;

// I want this to set both foo & bar to null
foo = null;

console.log(bar); // However, bar is still set to "data"

В C или C++ вы можете получить желаемое поведение с помощью указателей; две переменные ссылаются на одно и то же место в памяти.

Есть ли способ имитировать это поведение в JavaScript?

1
Nick Zuber 18 Дек 2015 в 00:14

4 ответа

Лучший ответ

В JavaScript переменные, которые имеют объекты в качестве значения, на самом деле являются скалярными ссылками (указателями) на объекты, поэтому присваивание просто копирует ссылки на объекты, а не сами объекты. Итак, когда вы делаете

var bar = foo;

Значение foo копируется. Это означает, что foo и bar имеют копии одного и того же значения.

Даже с объектами это не сработает

var x = {};
var y = x; // y and x both point to the same object
x = null;
// y still points to the object

И снова x и y являются копиями ссылки, поэтому и x, и y являются отдельными ссылками, каждая из которых имеет одинаковое значение. Но обнуление одного ничего не делает для другого.

Самое близкое, что вы можете получить - это то, что сказал @Derek 朕 會 功夫, что делать

var x = {val: 'data'};
var y = x;
delete x.val;
// y.val is now undefined 

И передайте x или y.

3
hvgotcodes 18 Дек 2015 в 18:43

Это происходит из-за различных типов переменных в JavaScript: примитива и ссылки. Взгляните на эту статью, раздел «Типы примитивов и типы ссылок» действительно хорошо объясняет это https://www.safaribooksonline.com/library/view/javascript-the-definitive/0596101996/ch04.html

0
Lisa Gagarina 17 Дек 2015 в 21:43

Нет, ты не можешь. Если значение является примитивом, значение копируется, а если это объект, ссылка копируется.

Единственное, что вы можете сделать, это указать несколько переменных на одном и том же объекте. Однако переназначение одной переменной не переназначит другую.

1
Alexander O'Mara 17 Дек 2015 в 21:18

Да. Сорта . Ссылки на объекты аналогичны указателям в C:

var foo = {value: "data"};
var bar = foo;

foo.value = undefined;
console.log("Value: %s", bar.value);  // undefined
2
Derek 朕會功夫 17 Дек 2015 в 21:16