2011-12-29 11 views
0
var Stars = new Array(1,2,3,4,5,6,7,8,9,10); 
var StarsX = new Array(451,455,460,470,490,100,160,220,280,300); 
var StarsY = new Array(451,455,460,470,490,480,390,330,200,120); 
var Starsm = Stars 
var StarsmX = StarsX 
var StarsmY = StarsY 

//just shows the output of the variables in a text field 
function contpost(){Tfield.innerHTML=Stars + "<br/>" + StarsX + "<br/>" + StarsY + "<br/>" + Starsm + "<br/>" + StarsmX + "<br/>" + StarsmY;} 

//cycles through the "for" loop and posts the variables 
function newpost(){ 
for (var i=0;i<Stars.length;i++){ 
    StarsmX[i] = StarsX[i] + 10; 
    StarsmY[i] = StarsY[i] + 10; 
    } 
contpost() 
} 


var Tfield= (This is the text field) 
var canv_one= (This is a canvas in my document) 
canv_one.addEventListener('click', newpost); 

このコード(Firefox 9)を実行すると、if/thenループは "mX"変数と "X"変数の両方に10を追加します。Javascript変数宣言問題

私は現在、どのようにそれを行うのか知っています。早くも同じように設定したからです。私は宣言でこれを代用すると、それが正常に動作します:

var Starsm = new Array() 
var StarsmX = new Array() 
var StarsmY = new Array() 

私は理解していない何ジャバスクリプトがこれをやっている理由です。私は、StarsxをStarsxと等しくすることは決してしませんでした。

私は、世界の宣言の間に一度等しくすると、後で再同値化されません。これは私がJavascriptの基本的な機能を理解していないことを意味しています。

誰でも手伝いできますか?

+0

配列を作成するときは、 'new Array()'ではなく '[]'を使用します(これは読みやすく、 'new Array(5)'を呼び出すと配列が生成される値5を持つ単一の要素ではなく5つの要素を持つ)。だから 'var Stars = [1,2,3,4,5,6,7,8,9,10];と' var Starsm = []; ' – nnnnnn

+0

OK。私は後でそれを変更します。私は基本的に私がgoogleできる何でもJavascriptを学んでいる。ベストプラクティスは必ずしも明確ではありません。 – Brightstar

+0

クール。 MDN:https://developer.mozilla.org/ja/JavaScript/Guideをご覧ください。また、Googleのヒント:いくつかのJavaScriptのキーワードや機能について知りたい場合は、Google検索用語の末尾に「mdn」や「mdc」を追加してください(例:「array mdn」)。これはMDNそのキーワード/機能についてのページを検索結果のトップに表示します。通常、「javascript」という単語は必要ありません。 – nnnnnn

答えて

4

変数に何も追加されていません。これはArrayに追加され、両方の変数が同じArrayオブジェクトを参照します。

これは、JavaScriptではの参照の参照のみをオブジェクト自体で保持することができないためです。したがって、配列への参照はコピーされる値であり、配列ではありません。

アレイの浅いクローンが必要な場合は、slice()を使用します。

var Starsm = Stars.slice() 
var StarsmX = StarsX.slice() 
var StarsmY = StarsY.slice() 

または、空の配列を作成してください。

+0

だから、基本的には、私がしたことは、 "星"は配列 "星"を含む変数になっているということですか? 私の意図は、オリジナルを複製した "Starsm"(etc)という名前の新しい配列を作成することでした。 – Brightstar

+0

@ user1120353:はい。 'var Starsm = Stars'は' Stars'が保持しているオブジェクト参照をコピーするので、どちらも同じArrayオブジェクトへの参照となります。元のArrayオブジェクトを(浅く)複製するには、 '.slice()'を使用します。 –

+0

ありがとうございます。私がそれをすることができたという考えは何らかの理由で私に起きたことさえなかった。 迅速なヘルプに感謝します。 – Brightstar