ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 一、定义 数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。 ~~~ var arr = ['a', 'b', 'c']; ~~~ 上面代码中的`a`、`b`、`c`就构成一个数组,两端的方括号是数组的标志。`a`是0号位置,`b`是1号位置,`c`是2号位置。 除了在定义时赋值,数组也可以先定义后赋值。 ~~~ var arr = []; arr[0] = 'a'; arr[1] = 'b'; arr[2] = 'c'; ~~~ * 任何类型的数据,都可以放入数组。 ~~~ var arr = [ {a: 1}, [1, 2, 3], function() {return true;} ]; arr[0] // Object {a: 1} arr[1] // [1, 2, 3] arr[2] // function (){return true;} ~~~ * 如果数组的元素还是数组,就形成了多维数组。 ~~~ var a = [[1, 2], [3, 4]]; a[0][1] // 2 a[1][1] // 4 ~~~ ## 二、数组的本质 本质上,数组属于一种特殊的对象。`typeof`运算符会返回数组的类型是`object`。 ~~~ typeof [1, 2, 3] // "object" ~~~ 上面代码表明,`typeof`运算符认为数组的类型就是对象。 数组的特殊性体现在,它的键名是按次序排列的一组整数(0,1,2...)。 ~~~ var arr = ['a', 'b', 'c']; Object.keys(arr); // ["0", "1", "2"] ~~~ 上面代码中,`Object.keys`方法返回数组的所有键名。可以看到数组的键名就是整数0、1、2。 ## 三、length 属性 数组的`length`属性,返回数组的成员数量。 ~~~ ['a', 'b', 'c'].length // 3 ~~~ JavaScript 使用一个32位整数,保存数组的元素个数。这意味着,数组成员最多只有 4294967295 个(2^32- 1)个,也就是说`length`属性的最大值就是 4294967295。 只要是数组,就一定有`length`属性。该属性是一个动态的值,等于键名中的最大整数加上`1`。 ~~~ var arr = ['a', 'b']; arr.length // 2 arr[2] = 'c'; arr.length // 3 arr[9] = 'd'; arr.length // 10 arr[1000] = 'e'; arr.length // 1001 ~~~ `length`属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员会自动减少到`length`设置的值。 ~~~ var arr = [ 'a', 'b', 'c' ]; arr.length // 3 arr.length = 2; arr // ["a", "b"] ~~~ 如果人为设置`length`为不合法的值,JavaScript 会报错。 ~~~ // 设置负值 [].length = -1 // RangeError: Invalid array length // 数组元素个数大于等于2的32次方 [].length = Math.pow(2, 32) // RangeError: Invalid array length // 设置字符串 [].length = 'abc' // RangeError: Invalid array length ~~~ ## 四、in 运算符 检查某个键名是否存在的运算符`in`,适用于对象,也适用于数组。 ~~~ var arr = [ 'a', 'b', 'c' ]; 2 in arr // true '2' in arr // true 4 in arr // false ~~~ 上面代码表明,数组存在键名为`2`的键。由于键名都是字符串,所以数值`2`会自动转成字符串。 注意,如果数组的某个位置是空位,`in`运算符返回`false`。 ~~~ var arr = []; arr[100] = 'a'; 100 in arr // true 1 in arr // false ~~~ ## 五、for…in 循环和数组的遍历 `for...in`循环不仅可以遍历对象,也可以遍历数组,毕竟数组只是一种特殊对象。 ~~~ var a = [1, 2, 3]; for (var i in a) { console.log(a[i]); } // 1 // 2 // 3 ~~~ 但是,`for...in`不仅会遍历数组所有的数字键,还会遍历非数字键。 ~~~ var a = [1, 2, 3]; a.foo = true; for (var key in a) { console.log(key); } // 0 // 1 // 2 // foo ~~~ 数组的遍历可以考虑使用`for`循环或`while`循环。 ~~~ var a = [1, 2, 3]; // for循环 for(var i = 0; i < a.length; i++) { console.log(a[i]); } // while循环 var i = 0; while (i < a.length) { console.log(a[i]); i++; } var l = a.length; while (l--) { console.log(a[l]); } ~~~