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/

这很简单,但我不知道为什么会这样。警报应该是 0,而不是 1,因为我已经将二维数组初始化为 0。

有人可以解释我为什么吗?

4

4 回答 4

7

让我们分解一下

var UserBoard = new Array(20,20);

您正在创建一个包含两个插槽的数组,它们都包含值“20”(int)。所以你的数组是[20, 20]

接下来,您的循环:

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

二维数组不是这样定义的。在这种情况下,只有“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”作为警报。

如果你想要二维数组,你应该使用以下符号:

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

逗号运算符计算其两个操作数(从左到右)并返回第二个操作数的值。

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 维数组,其长度等于参数的总数。在您的情况下,两个整数创建一个具有 2 个值的数组。每个索引都将被初始化为其对应的参数。在你的情况下:索引 0 === 20,索引 1 === 20,如果你写new Array(20,10)了 ,结果将是一个像[20,10].

你得到了基本的想法。
重要的是要注意,使用逗号访问多维数组是行不通的:arr[1,2]你应该写而不是写arr[1][2]. 谷歌一些 JavaScript 的介绍性教程,不会有什么坏处……你很快就会明白为什么使用数组构造函数不是创建数组的最佳方式

于 2012-06-22T11:22:30.940 回答