JavaScript-通过引用传递对象

JavaScript-通过引用传递对象,javascript,arrays,prototypejs,push,prototype,Javascript,Arrays,Prototypejs,Push,Prototype,可能重复: 考虑以下代码: var a = 'cat'; var b = 'elephant'; var myArray = [a,b]; a = 'bear'; myArray[0]仍将返回“cat”。是否有方法将引用存储在数组中而不是克隆中,以便myArray[0]返回“bear”?否。JavaScript不会以这种方式进行引用。不,这是不可能的。JavaScript不支持这样的引用 只有对象存储为引用。但我怀疑这是你想要的。你已经回答了你自己的问题。如果希望myArray[0]等于b

可能重复:

考虑以下代码:

var a = 'cat';
var b = 'elephant';
var myArray = [a,b];

a = 'bear';

myArray[0]仍将返回“cat”。是否有方法将引用存储在数组中而不是克隆中,以便myArray[0]返回“bear”?

否。JavaScript不会以这种方式进行引用。

不,这是不可能的。JavaScript不支持这样的引用


只有对象存储为引用。但我怀疑这是你想要的。

你已经回答了你自己的问题。如果希望myArray[0]等于bear,请设置:

myArray[0] = "bear";

即使数组包含对对象的引用,使变量引用完全不同的对象也不会更改数组的内容

您的代码不会修改a引用的对象变量。它使变量a完全引用不同的对象

与您的JavaScript代码一样,以下Java代码也无法工作,因为与JavaScript一样,Java通过值传递对对象的引用:

  Integer intOne = new Integer(1);
  Integer intTwo = new Integer(2);

  Integer[] intArray = new Integer[2];
  intArray[0] = intOne;
  intArray[1] = intTwo;

  /* Make intTwo refer to a completely new object */

  intTwo = new Integer(45);

  System.out.println(intArray[1]);

  /* output = 2 */
在Java中,如果更改变量引用的对象(而不是为变量指定新的引用),则可以获得所需的行为

例如:

  Thing thingOne = new Thing("funky");
  Thing thingTwo = new Thing("junky");

  Thing[] thingArray = new Thing [2];

  thingArray[0] = thingOne;
  thingArray[1] = thingTwo;

  /* Modify the object referenced by thingTwo */

  thingTwo.setName("Yippee");

  System.out.println(thingArray[1].getName());

  /* output = Yippee */

  class Thing
  {
      public Thing(String n) { name = n; }
      private String name;
      public String getName() { return name; }
      public void setName(String s) { name = s; }
  }

虽然我同意其他人的说法,你应该使用myArray[0]=随便什么,但如果你真的想完成你想要完成的事情,你可以确保数组中的所有变量都是对象

var a = {animal: 'cat'},
    b = {animal: 'elephant'};

var myArray = [a, b];

a.animal = 'bear';


myArray[0]。动物现在是“熊”

不,但在这种情况下,您可能需要更新数组:
myArray[0]='bear'
。我找不到创建此类引用的原因。因为每次我编辑数组中对象的属性时,都必须手动更新数组。如果要“编辑数组中对象的属性”,为什么不直接编辑数组?您正在更改变量a引用的对象。您没有更改变量a所引用的对象,因此它无论如何都不会工作…确切地说。但是,如果您创建一个新对象,然后将其指定给一个(a=newObject而不是a.animal=newObject),它将不起作用。这就是我认为OP(或者可能是我)混淆的地方。那么你是说如果我设置$a='foo',那么$b=$a,$c=$a,$a='junk',你是说$b和$c现在将等于'junk'??我手头没有php环境,但这似乎很疯狂。我同意如果a是指针,而你正在编写一个C程序(我想我从来没有在php中使用过指针)。@jahroy:没有,但是如果你设置
$b=&$a
,那么它将是真的。真相-见@hobberwickey的答案。我不确定我是否同意JavaScript不支持引用。将对象指定给数组时,可以修改该属性,该属性也将在数组中修改。也许我遗漏了什么?记住这个问题是关于JavaScript的。@jmort253:我同意真理的答案在这一点上不是很具体。我认为“这样的引用”是指“对原始值的引用”,这在JavaScript(或其他语言,如Python、Java等)中是不存在的。当然,对对象的引用是另一个话题。你可能没有抓住问题的重点。op询问是否可以在数组中存储引用,这样他就不必像您那样直接显式访问数组。有关更多信息,请参阅。我知道这一点,仅表明如果目标是更改存储在数组中的某个对象的值,则需要通过数组索引器访问该对象。通常,在StackOverflow上,答案应该回答这个问题。否则,应将其作为对问题的评论发布。考虑添加更多的信息来回答问题,因为这会使你的帖子对社区更有价值。祝你好运我知道你在这方面做了很多工作,写得很好,但问题是关于JavaScript的,问题被标记为
JavaScript
而不是Java。然而。因此,在这个具体案例中,我认为你的回答和解释仍然有效。考虑添加一些JavaScript示例,以便彻底。谢谢我意识到问题是关于JavaScript的,但我认为这可能有助于说明一点。你说得很好,添加一些javascript(或替换java)会非常简单。我赞成添加。我不喜欢扔掉好的信息,即使它可能有点错位。一个小问题是,请务必查看关于Java和JavaScript按值传递而不是按引用传递的文章。在您的回答中,这是您可能需要解决的唯一问题。:)祝你好运谢谢,我刚看了。。。我会修好的。我想我是那种认为java通过引用传递对象而不是通过值传递引用的人。耶,我今天学到了很多东西!再次感谢。