Я знаю, что на этот вопрос уже есть принятый ответ, но я думаю, что стоит отметить, что есть несколько разных решений. Хотя да, AS3 наивно не поддерживает двумерные массивы, он поддерживает массивы массивов, которые можно использовать для воспроизведения его функциональности.
Чтобы грубой силой инициализировать массив массивов, что и пытается сделать опера, существует несколько прямой подход. Чтобы сделать массив 3х3, можно написать:
var arr5:Array = new Array(new Array(3), new Array(3), new Array(3));
или, может быть, даже более просто и загадочно:
var arr6:Array = [[0,0,0],[0,0,0],[0,0,0]] // Create a 3x3 array with all values set to 0
и если вы собираетесь инициализировать значения сразу в цикле, вы можете даже сойти с рук:
var arr6:Array = [[],[],[]] // Create an empty '2D' array with 0 cols and 3 rows
Теперь я бы не стал делать массив размером 10x10, как этот, но он прост и работает для небольших многомерных массивов. Для больших многомерных массивов лучше всего инициализировать в цикле, как принятый ответ.
Но это также подходящее время, чтобы поговорить о векторах. Если вы создаете массив и знаете, что он всегда будет содержать определенный класс (и особенно если он всегда будет иметь определенную длину), то вы можете использовать векторный класс.
var rows:uint = 10, cols = 10;
var multiArray:Vector.<Vector.<Number>> = new Vector.<Vector.<Number>>(rows, true);
for(var i:uint = 0; i < rows; i++) multiArray[i] = new Vector.<Number>(cols, true);
Это создаст двумерный массив чисел 10x10 фиксированного размера. Определенно есть некоторые преимущества использования вектора со строгим типом над массивом.
Причина, по которой второй пример дает сбой, заключается в том, что, как и комментарий в принятом ответе, оба раза создается массив 1x2. Расширенная форма
// var multiArray:Array = new Array([3],[3])
var multiArr:Array = []
multiArray[0] = [3]
multiArray[1] = [3]
Обратите внимание, что multiArray[0][1]
равно undefined
. Но что еще более важно, multiArray [2] - это undefined
все вместе. Сбой при попытке сослаться на multiArray[2][0]
, потому что его просто нет.
Также обратите внимание, что Array
во флэш-памяти запасные массивы (класс Vector
имеет плотность ). Это означает, что вы можете делать такие вещи, как:
var arr7:Array = [];
arr7[100] = 1;
Он оставляет позиции от 0 до 99 как undefined
и просто устанавливает индекс 100 на 1