是否有可能有2个变量指向同一个对象? (JavaScript的)

时间:2012-08-27 14:18:32

标签: javascript pointers pass-by-reference

我试图让变量“my_a”和letters.a指向同一个对象。

//i want letters.a to reference (point to) my_a, not be a copy...
//expected output should be: letters.a = c
//made variables into Objects.. but didn't help.

var my_a = new Object('a');
var my_b = new Object('b');
var letters = {'a': my_a, 'b': my_b};

$('#output').append('my_a = ' + my_a + '<br>');
$('#output').append('leters.a = ' + letters.a + '<br>');

my_a = new Object('c');

$('#output').append('my_a = ' + my_a + '<br>');
$('#output').append('letters.a = <span style="color:red">' + letters.a + '</span>');
​

看到这个小提琴:

http://jsfiddle.net/jCsUq/1/

但正如您可以通过输出看到的,这不起作用。

有什么想法吗?这可以用javascript吗?

谢谢。

6 个答案:

答案 0 :(得分:5)

你的问题的答案是“是”,但我认为你的问题没有准确描述你想要做的事情。你想要的是letters.a引用变量“my_a”,意思是在C ++中用&运算符可以做什么。这在JavaScript中是不可能的。

声明:

my_a = new Object('c');

你给“my_a”一个新的,不同的价值。因此,letters.a仍然指的是它所做的相同的事情,而“my_a”已经改变了。没有办法让变量或对象属性“跟踪”另一个(在JavaScript中)。

编辑 - 实际上我发现你可以通过为“字母”的“a”属性定义“getter”来做你喜欢的事情,返回“my_a”的当前值。它需要您正在使用的JavaScript引擎中的功能,但它看起来像:

var letters = {};
Object.defineProperty(letters, "a", {
  get: function() { return my_a; },
  set: function(v) { my_a = v; }
});
不幸的是,IE9之前的IE不支持。 Here's the updated jsfiddle.

答案 1 :(得分:4)

您可以将2个变量指向javascript中的相同对象或值,如下所示:

var a = b = {};
// both a and b now reference the same object

此外,不需要使用对象构造函数,花括号用作构造函数并保存键入。即,这个:

var a = new Object();

相当于:

var a = {}

答案 2 :(得分:2)

您对指针的概念感到困惑。将对象存储在变量中时,实际上将该对象的地址存储在变量中。

因此,my_a和letters.a都包含同一对象的地址。然后你改变my_a以包含一个新对象的地址。但letters.a仍然包含第一个对象的地址!

因此,在您的脚本结束时,您的my_a指向对象&c 39,并且字母指向对象&#39; a&#39;。

让letters.a和my_a指向您调用的对象&#39; c&#39;的唯一方法是

letters.a = my_a

再次,设置letters.a以包含新的&#39; c&#39;的地址。对象

顺便说一下,持有更基本类型的变量(如ints,char)实际上包含变量本身的值,而不是指向实际数据的指针。

答案 3 :(得分:0)

是的,这是可能的。

你是在正确的方向,但犯了一个小错误。 初始化var letters = {'a': my_a, 'b': my_b};时,您插入了my_a当时指向的对象

之后更改my_a并未更改letters,因为它已包含指向Object('a')的直接指针。

答案 4 :(得分:0)

是的,它非常有可能并且是默认值。但是,在您的代码中,当您要修改值时,您正在修改引用(my_a = new Object('c');)。如果你使用数组而不是字符串,这将更清楚地说明,例如my_1 = [23]; my_1 [0] = 8;

答案 5 :(得分:0)

为什么你没有使用这样的结构:

var letters = {'a': (new Object('a')), 'b': (new Object('b'))};

这是更清洁的imho。