在JavaScript中数组可以容纳任何类型的值,可以是字符串、数字、对象(object),甚至是其他数组(多维数组就是此方式实现的)。
数组声明后即可向其中加入值,不需要预先设定大小。
使用delete运算符可以将单元从数组中删除,注意,单元删除后,数组的length属性并不会发生变化。

  1. var a = []
  2. a[0] = 1
  3. a[2] = 3
  4. a[1] // undefined
  5. a.length // 3

上面的代码可以正常运行,但其中的“空白单元”(empty slot),可能会导致出人意料的结果。a[1]的值为undefined,但这与将其显式赋值为undefined还是有所区别。
数组通过数字进行索引,但有趣的是他们也是对象,所以也可以包含字符串键值和属性(但这些并不计算数组长度内)

  1. var a =[]
  2. a[0] = 1
  3. a["foobar"] = 2
  4. a.length // 1
  5. a["foobar"] // 2
  6. a.foobar // 2

注意:如果字符串键值能够被强制类型转换为十进制数字的话,它就会被当作数字索引来处理。

  1. var a = []
  2. a["13"] = 42
  3. a.length // 14

在数组中加入字符串键值/属性并不是一个好主意。建议使用对象来存放键值/属性值,用数组来存放数字索引值。

类数组

有时需要将类数组(一组通过数字索引的值)转换为真正的数组,这一般通过数组工具函数,如(indexOf(…)、concat(…)、forEach(…))等来实现。
例如,一些DOM查询操作会返回到元素列表,它们并非真正意义上的数组,但十分类似。另一个例子是通过arguments对象(类数组)将函数的参数当作列表来访问(从ES6已废止)
工具函数 slice(...) 经常被用于这类转换:

  1. function foo() {
  2. var arr = Array.prototype.slice.call(arguments)
  3. arr.push('bam')
  4. console.log(arr)
  5. }
  6. foo('bar', 'baz') // ['bar', 'baz', 'bam']

ES6的内置工具函数 Array.from(...) 也能实现同样的功能:

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from Array.from 方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

  1. var arr = Array.from('abc');
  2. arr; // ["a", "b", "c"]