3
var UserBoard = new Array(20,20);
for(var i = 0; i < 21; ++i){
    for(var j = 0; j < 21; ++j){
        UserBoard[i,j] = 0;
    }
}
document.write(UserBoard[3,5]);
UserBoard[4,5]=1;
document.write(UserBoard[3,5]);

http://jsfiddle.net/XbyqN/2/

とても簡単ですが、なぜそうなるのかわかりません。2D配列を0に初期化したので、アラートは1ではなく0にする必要があります。

誰かが私に理由を説明できますか?

4

4 に答える 4

7

分解しましょう

var UserBoard = new Array(20,20);

2つのスロットを持つ配列を作成しています。どちらにも値「20」(int)が含まれています。だからあなたの配列は[20, 20]

次に、あなたのループ:

for(var i = 0; i < 21; ++i){
  for(var j = 0; j < 21; ++j){
    UserBoard[i,j] = 0;
  }
}

2次元配列はこのように定義されていません。その場合、「j」カウンターだけが何かをします。「i」は単に無視されます。したがって、次のような配列になります。[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

次に、割り当て:

UserBoard[4,5]=1;

と同等です:

UserBoard[5]=1;

そしてあなたの警告:

alert("test: " + UserBoard[3,5]);

と同等です:

alert("test: " + UserBoard[5]);

そのため、アラートとして「1」が表示されます。

2次元配列が必要な場合は、次の表記を使用する必要があります。

UserBoard[4][5] = 1;

MDNですべてを読んでください:https ://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

于 2012-06-22T11:09:45.033 に答える
1

UserBoard[i][j]の代わりに必要ですUserBoard[i,j]

多次元配列は、機能すると思われるように機能しません。実際、それらは配列の配列です。

これを使って :

var UserBoard = new Array(20);
for(var i = 0; i < 20; ++i){
  UserBoard[i] = new Array(20);
  for(var j = 0; j < 20; ++j){
    UserBoard[i][j] = 0;
  }
}

console.logChromeの開発者ツールを使用してコード(またはFirebug)をデバッグすることをお勧めします。コードの最後でこれを試してから、F12キーを入力してください。

console.log(UserBoard);
于 2012-06-22T11:09:09.007 に答える
1

コンマ演算子は、両方のオペランド(左から右へ)を評価し、2番目のオペランドの値を返します。

var UserBoard = new Array(20,20); // [20, 20]
for(var i = 0; i < 21; ++i){
  for(var j = 0; j < 21; ++j){
    UserBoard[i,j] = 0; // UserBoard[j] = 0
  }
}
UserBoard[4,5]=1; // UserBoard[5] = 1
alert("test: " + UserBoard[3,5]); // UserBoard[5]

あなたが欲しいものは:

var UserBoard = [];
for (var i = 0; i < 20; i++) { // i < 20
    UserBoard[i] = [];
    for (var j = 0; j < 20; j++) {
        UserBoard[i][j] = 0;
    }
}
UserBoard[4][5]=1;
alert("test: " + UserBoard[3][5]);
于 2012-06-22T11:09:21.227 に答える
0

配列コンストラクター()を使用して新しい配列を作成する場合new Array、引数のタイプと総数に応じて、引数の意味が異なります。

var array20long = new Array(20);// = [undefined,undefined,undefined,....].length === 20
var arrayString = new Array('foo');// = ['foo']
var yourArray = new Array(20,20);// = [20,20]

簡単に言うと、1つの整数を配列コンストラクターに渡すと、渡されるintに等しい長さの配列が作成され、複数の整数を渡すと、引数の総数に等しい長さの1つの1次元配列になります。あなたの場合、2つの整数が2つの値を持つ配列を作成します。各インデックスは、対応する引数に初期化されます。あなたの場合:インデックス0 === 20、インデックス1 === 20、あなたが書いたnew Array(20,10)場合、結果はのような配列になります[20,10]

あなたは基本的な考えを理解します。
カンマを使用して多次元配列にアクセスすることは機能しないことに注意することが重要です。書く代わりに、を書くarr[1,2]べきでしたarr[1][2]。グーグルはJavaScriptの入門チュートリアルをいくつか使っていますが、害はありません...そして、配列コンストラクターを使用することが配列を作成する最良の方法ではない理由をすぐに学びます

于 2012-06-22T11:22:30.940 に答える