2012-05-11 1 views
4

可能性の重複オブジェクトを渡す:
How can I store reference to a variable within an array?Javascriptを - 参照して

は、次のコードを考えてみましょう:

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

a = 'bear'; 

myarrayのを[0]まだ '猫' を返します。 myArray [0]が 'bear'を返すように、クローンの代わりに配列に参照を格納する方法はありますか?

+0

いいえ、この場合、配列myArray [0] = 'bear''を更新することができます。私はそのような参照を作成する理由を見つけることができません。 – lu1s

+0

私は配列のオブジェクトのプロパティを編集するたびに、私は手動で配列を更新する必要があります。 – indieman

+0

「配列内のオブジェクトのプロパティを編集する」ときに、配列を直接編集しないのはなぜですか? – jahroy

答えて

6

いいえ.Javascriptはそのように参照を行いません。

1

いいえ、できません。 JavaScriptはそのような参照をサポートしていません。

オブジェクトのみが参照として格納されます。しかし、私はそれがあなたがここで欲しいものだとは思わない。

+0

どのような言語ですか? – jahroy

+0

@jahroy:少なくともPHPとC。 –

+0

$ a = 'foo'、$ b = $ a、$ c = $ a、$ a = 'junk'を設定すると、$ bと$ cが'ジャンク'と等しい?私は便利なPHP環境を持っていないが、それはかなり狂っているようだ。 – jahroy

1

あなたは一種のあなたが同じクマにmyarrayの[0]をしたいならば、設定し、あなた自身の質問に答えました:

myArray[0] = "bear"; 
+1

あなたは質問のポイントを見逃しているかもしれません。オペアンプは、配列に参照を格納できるかどうかを尋ねていました。正確には、配列のように明示的にアクセスする必要はありません。詳細については、http://stackoverflow.com/a/10559622/552792を参照してください。 – jmort253

+0

私はそれを知っています。純粋に、配列インデクサーを通じてアクセスする必要がある配列に格納された何かの値を変更することが目標であることを示しています。 – dougajmcdonald

+0

一般的にStackOverflowでは、それ以外の場合は、質問にコメントとして投稿する必要があります。あなたの投稿をコミュニティにとってより価値のあるものにするために、質問に答える情報を追加することを検討してください。がんばろう! – jmort253

1

をあなたの配列は、変数が完全に参照しながら、オブジェクトへの参照を保持している場合でも、異なるオブジェクトは配列の内容を変更しません。

コードはオブジェクトを変更しません。変数aを参照してください。 変数をとすると、別のオブジェクトを参照します。

ちょうどあなたのjavascriptのコードのように、次のJavaコードは動作しませんジャバスクリプトのように、Javaは値によってオブジェクトへの参照を渡し、ため: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 */ 

、あなたは変数が参照するオブジェクトを変更した場合(新しい参照を変数に代入するのではなく)あなたが望む動作を得ることができます。

例:

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; } 
    } 
+0

私はあなたがこれに多くの作業を入れていることを知っています。それは本当にうまく書かれていますが、質問はJavaScriptに関するもので、質問はJavaではなくJavaScriptでタグ付けされています。しかし、[JavaとJavaScriptは両方ともオブジェクト参照も値渡しの値渡し](http://blog.opensourceopportunities.com/2008/07/javascript-and-java-are-pass-by-value.html) )。したがって、この特定のケースでは、私はあなたの答えと説明がまだ立っていると思います。 JavaScriptの例をいくつか追加して、徹底的に検討してください。 :) – jmort253

+0

ありがとう。私はこの質問がJavaScriptに関することであることを認識していますが、これがポイントを説明するのに役立つかもしれないと考えました。あなたは、いくつかのjavascriptを追加する(またはjavaを置き換える)のはかなり簡単だろうという良い点を作っています。 – jahroy

+0

私は追加が好意的です。私は、たとえそれが少しずれていても、良い情報を投げ捨てるのは好きではありません。 1つの小さな点は、JavaとJavaScriptの記事が参照渡しではなく値渡しであることを確認してください。あなたの答えでは、それはあなたが直す必要がある唯一のものです。 :) がんばろう! – jmort253

7

私はあなただけmyarrayのを使用する必要があることを言って皆に同意しながら、あなたが本当にあなたがあなたを達成しようとしているものを達成したい場合は、[0] =そのことを確認できたものは何でも、配列内の変数はすべてオブジェクトです。

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

var myArray = [a, b]; 

a.animal = 'bear'; 

myArray [0] .animalは 'bear'になりました。

+1

正確です。しかし、新しいオブジェクトを作成し、それを(a.animal = newObjectの代わりにa = newObject)に割り当てると、それは機能しません。これは私がOP(あるいは多分私)が混乱していると思うところです。 – jahroy

関連する問題