有可能有两个变量指向同一个对象吗?(javascript)

有可能有两个变量指向同一个对象吗?(javascript),javascript,pointers,pass-by-reference,Javascript,Pointers,Pass By Reference,我试图让变量“my_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

我试图让变量“my_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>');
​
//我想要字母。a指向我的a,而不是副本。。。
//预期输出应为:字母a=c
//将变量转换为对象。。但是没有帮助。
var my_a=新对象('a');
var my_b=新对象('b');
变量字母={'a':my_a,'b':my_b};
$(“#输出”).append('my#a='+my#a+'
'); $('#output').append('leters.a='+letters.a+'
'); my_a=新对象(“c”); $(“#输出”).append('my#a='+my#a+'
'); $('#output').append('letters.a='+letters.a+''); ​
看这把小提琴:

但正如您从输出中看到的,这是不起作用的

有什么想法吗?这在javascript中是可能的吗


谢谢。

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

var a = b = {};
// both a and b now reference the same object
此外,不需要使用对象构造函数,大括号用作构造函数并保存键入。也就是说,这个:

var a = new Object();
相当于:

var a = {}

你的问题的答案是“是的”,但我认为你的问题没有准确地描述你试图做的事情。你想要的是<代码>字母。一个< /COD>引用变量“MyIa”,在C++中,可以用<代码>和<代码>操作符来做什么。这在JavaScript中是不可能的

在发言中:

my_a = new Object('c');
你给了“我的”一个新的、不同的价值。因此,
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不支持这一点

你被指针的概念弄糊涂了。在变量中存储对象时,实际上是在变量中存储该对象的地址

所以,我的字母a和字母a都包含同一个对象的地址。然后更改my_a以包含新对象的地址。但是字母。a仍然包含第一个对象的地址

在脚本的末尾,我的a指向对象c,字母a指向对象a

要让字母.a和my_a指向你称之为“c”的对象,唯一的方法是

letters.a = my_a
同样,将字母.a设置为包含新“c”对象的地址

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

是的,这是可能的

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


之后更改
my_a
并没有更改
字母
,因为它已经包含指向
对象('a')

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

为什么不使用这种构造:

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

它比你想象的要干净得多。

好吧,你并不是真的在做你想做的事。将一个对象的内部变量指向另一个对象的值。但是,在JavaScript中,做您正试图做的事情是很愚蠢的。请问你的最终目标是什么?也许我们可以找到更好的解决办法。@SpYk3HH我只需要一个当前“字母”的参考。只有两个“字母”。旧的或新的。它们需要在不同的时间切换。letter1变为旧,letter2变为新。@Wesley我用一种可能的方法更新了我的答案,具体取决于您的浏览器支持需要。您可以做的另一件事是将字母设置为数组,并编写一个简单的func以使用新字符FiFo数组。类似于
函数fifoArray(myArray,newValue){myArray.pop();myArray.unshift(newValue);}
那么myArray[0]永远是最新的,myArray[1]永远是最新的。这样做有什么改进或好处吗?