什么是真正的多维数组?

16

我正在阅读一本关于JavaScript的书籍,看到了这行代码:

JavaScript不支持真正的多维数组,但你可以使用数组的数组来近似它们。

有什么区别?

5个回答

17

一个真正的多维数组必须使用多个索引进行索引。而一个由若干个数组组成的数组可以使用单个索引进行索引,它将返回另一个数组。一个真正的多维数组存储所有数据都是连续的。而一个由若干个数组组成的数组存储其所有组成数组是任意散布的。这可以通过对真正数组的缓存效应来提高迭代性能。


如果存在一个数组,让您使用单个索引检索“行”,但确实将所有数据连续存储,那么它一定不是真正的多维数组吗?换句话说,这两个约束条件是否都必须满足,还是只需要后者? - kojiro
3
请注意,例如在JavaScript中,不存在强制要求二维数组的行具有相同数量的列的规定。 - Pointy
1
“数组的数组将其所有组成数组任意散布”这句话并不一定正确:在C语言及其衍生语言中,[][] 数组保证是连续的。 - dmckee --- ex-moderator kitten

3
(这是一个视觉解释,与 @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

JavaScript中没有类似于...

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

...具有强制长度的数组,就像矩阵一样。

但是,您可以构建一个Array,其中其成员都是固定长度的Array。如果其中一个子Array具有不同的长度,则它将成为不规则Array


2
作者似乎认为“真正的”多维数组应该满足以下条件:
  • 是数组;

  • 按值存储,而不是按引用存储;

  • 具有相同的长度。

JavaScript数组可以包含其他数组,但只能按引用而非按值存储。也就是说,每行的元素可能在内存中是连续的,但行本身可能不是。此外,由于JavaScript是动态类型语言,不存在静态表示所有内部数组必须具有相同长度的方法。
但在JavaScript中,数组的数组恰好是表示多维数组所需的方式,你学习这门语言时不需要关注其内部细节。

1
尽管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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接