数组

1. 集合与数组:
(1) 数学中的集合Set是所有研究对象组成的总体 —— 无序、不重复, 集合中的每个对象叫做这个集合的元素Element. 集合可以列举法, 把所有的元素一一列举起来, 并用花括号 { } 括起来, 如 A = {0, 1, 2, 3, 4, 5}, 这与 B = {5, 4, 3, 2, 1, 0} 是一样的, A = B. 但不能出现{0, 1, 2, 3, 3}, 因为集合中的元素不能重复.

(2) JavaScript数组是无类型的值的有序集合, 数组中的每个元素在数组中有个排序, 称为索引index. 数组中的元素可以重复, 如下代码中的1和-1重复 出现了多次. 数组继承了 Array.prototype 属性. 在 ES6 中已经有了 Set. var positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];

2. 创建数组:
(1) 数组直接量 var empty = [ ]; // 没有元素的空数组 var numbers = [2, 4, 6, 8]; var fruits = ['apple', 'orange', 'banana']; var data = [23, 'Hello', false]; // 元素不同类型 (2) 构造函数 var arr = new Array(); // 等同于直接量[ ] var arr = new Array(10); // 指定数组的长度, 即元素个数为10 var data = new Array(23, 'Hello', false);

3. 数组元素的读和写:
使用中括号 [ ] 来访问和改写数组中的元素, [ ] 里的是索引 index, 从0到232-2的整数. 数组中的第一个元素的索引是0, 而非1. 如果省略数组直接量的某个值, 省略的元素将被赋予 undefined. var data = [23, 'Hello', false]; console.log( data[0] ); // 23 console.log( data[1] ); // Hello console.log( data[2] ); // false data[2] = true; console.log( data[2] ); // true var a = [1,,2]; console.log( a[1] ); // undefined

4. 数组的长度:
集合Set有另一种表示方式 —— 描述法: 用数学符号描述共同特征, 在花括号{}内先写上表示这个集合元素的一般符号(及其取值范围), 再画上“|”, 然后写出元素的共同特征, 如: 奇数表示为 E = { x | x = 2k + 1, k ∈ Z }. 奇数是无限的, 表明集合的空间可以无限大. 但数组的长度是有限的, 最大可容纳232-1个元素. 通过.length来访问数组的长度. 数组直接量的语法允许有可选的结尾的逗号, 所以 下面代码中的 b = [, ,] 的长度为2, 而不是3. var data = [23, 'Hello', false]; console.log( data.length ); // 3 var a = [1,,2], b = [,,]; console.log( a.length ); // 3 console.log( b.length ); // 2

5. 遍历数组: 用 for / for in 循环 var numbers = [0, 1, 2, 3, 4, 5]; for(var i = 0; i < numbers.length; i++){ // for(var i in numbers) 也可以 console.log( numbers[i] ); }

6. 数组的比较:
并非两个数组的长度一致, 元素以及排序都相同, 这两个数组将相对了. 如下代码 a 和 b 都是 [0, 1, 2, 3, 4, 5], 但判断是否相等, 打印出来的结果是 false, 因为这两个对象在内存中有不同的指引. 只要是var出来的两个数组, 通过运算符 == 来判断, 都不会相等. 其实目的是要判断数组里的元素及其排序是否一致, 可按照以下逻辑:
(1) 先判断数组的长度是否相等.
(2) 再判断里面的每一个相同索引的元素是否相等. 可参考 equalArray() 函数. var a = [0, 1, 2, 3, 4, 5], b = [0, 1, 2, 3, 4, 5]; console.log( a == b ); // false function equalArray(a, b) { if(a.length != b.length) return false; for(var i = 0; i < a.length; i++){ if(a[i] != b[i]) return false; } return true; }