Что такое настоящий многомерный массив? - PullRequest
16 голосов
/ 31 декабря 2011

Я читал книгу о Javascript и увидел эту строку;

JavaScript не поддерживает истинные многомерные массивы, но вы можете аппроксимировать их массивами массивов.

Какая разница?

Ответы [ 5 ]

17 голосов
/ 31 декабря 2011

Истинный многомерный массив должен быть проиндексирован с несколькими индексами.Массив массивов может быть проиндексирован одним индексом, который будет возвращать другой массив.Истинный многомерный массив хранит все свои данные непрерывно.Массив массивов хранит все его составные массивы, произвольно разбросанные вокруг.Это может улучшить производительность итерации из-за эффектов кэширования для истинных массивов.

3 голосов
/ 31 декабря 2011

(визуальное объяснение, которое дополняет превосходный ответ из @ recursive )

В некоторых языках (C #) есть оба.Разница заключается в «форме» таких массивов.

int[3, 4] // true two-dimensional array

// it will "look" like this, rectangular shape
[[0, 0, 0, 0]
 [0, 0, 0, 0]
 [0, 0, 0, 0]]

Но когда вы определяете массив массивов, он может легко (особенно в javascript) выглядеть следующим образом.Это называется зубчатый массив .

[[0, 0]
 [0, 0, 0, 0, 0, 0]
 [0, 0, 0]]
2 голосов
/ 31 декабря 2011

Автор, похоже, предполагает, что «истинный» многомерный массив - это тот, в котором все элементы:

  • являются массивами;

  • хранятсяпо значению, а не по ссылке;и

  • имеют одинаковую длину.

Массивы JavaScript могут содержать другие массивы, но не по значению, а только по ссылке.То есть элементы каждой строки могут быть смежными в памяти, но сами строки не могут.Кроме того, нет никакого способа статически указать, что все внутренние массивы должны иметь одинаковую длину, поскольку JavaScript динамически типизируется.

Но массив массивов - это именно то, что вы должны использовать для представления многомерного массива.в JavaScript, и детали внутреннего представления, вероятно, не имеют отношения к вам, когда вы только изучаете язык.

2 голосов
/ 31 декабря 2011

В JavaScript нет ничего подобного ...

var arr = new Array[5][3]; /* Some weird JS/C-like thing for demonstration */

... с принудительной длиной. Как матрица.

Однако вы можете построить Array, все члены которого Array фиксированной длины. Если бы один из суб Array s имел другую длину, он был бы зубчатым Array.

1 голос
/ 31 декабря 2011

Хотя в спецификации JavaScript (3.0) не упоминаются многомерные массивы, они фактически возможны. Многомерные массивы могут быть представлены массивами массивов. См .

Например.

var items = [[1,2],[3,4],[5,6]];
alert(items[0][0]); // Would alert 1

Одномерный массив в Javascript.

var a = [0, 1, 2, 3];
a[[2]] === a[2]; // this is true

2 == [2] //true
// Even complex
2 == [[[2]]]  //true

// And even more
var a = { "xyz" : 1 };
a[[[["xyz"]]]] === a["xyz"];  //true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...