第7章 数组
JavaScript数组索引基于32位数值,以0开头,最大索引2^32-2,最大容纳4294967295,大约42亿个。
JavaScript数组是动态的,根据需要增长或缩减,可能是稀疏的,有length属性。
用数字索引来访问数组比一般访问常规对象属性要快得多。
7.1 创建数组
7.1.1 直接量
直接量:var empty=[],var primes=[2,3,5,7,11]等等
直接量中不一定都是常量,也可以是表达式
可以包含对象直接量或者其他数组直接量
省略数组直接量中某个值,省略元素被赋予undefined值
数组直接量语法允许有可选的结尾的逗号,故[,,]只有两个元素而非三个
7.1.2 调用构造函数Array()
调用时没有参数
var a=new Array();等同于数组直接量[]
调用时有一个数值参数,指定长度
当预先知道所需元素的个数时,用来预分配一个数组空间。
var b=new Array(10);
显式指定多个数组元素或数组非数值元素
var c=new Array(5,4,3,2,1,"testing,testing");
字面量比Array()构造函数简单多了。
7.2 数组元素的读和写
普通读写太熟悉了,不介绍了。
记住,数组是对象的特殊形式,a.[0]访问数组就像访问对象属性一样。
常规对象也可以这样用:
数组也是对象,所有索引都是属性名,索引会自动维护一个length属性值,只有非负整数才能是索引,所以如下数组长度是5而不是6.
7.3 稀疏数组
稀疏数组就是包含从0开始的不连续索引的数组,通常数组length属性值代表元素个数,如果数组是稀疏的,length属性值大于元素的个数。可以用Array()构造函数或简单的指定数组的索引值大于当前的数组长度来创建稀疏数组。
足够稀疏的数组通常在实现上比稠密的数组更慢,内存利用率更高,在这样的数组中查找元素的时间与常规对象属性查找时间一样长。
数组元素中undefined和不存在的微妙区别
当前浏览器控制台显示相同
7.4 数组长度
length通常比最大索引+1
给一个数组赋值,索引i>=length时,length设为i+1
设置length为=n的元素删除
如果想让数组成为一个只读,或者不可配置的对象,可以用对象中的方法:
Object.defineProperty(a,"length",{writable:false})
Object.seal()和Object.freeze()方法
7.5 数组元素的添加和删除
添加元素最简单的方法:为新索引赋值
push()方法,数组末尾增加
在数组末尾增加一个或多个元素
unshift()方法,数组首部插入元素
删除数组元素
删除数组元素与赋undefined类似,delete不会修改length属性,也不会将元素从高索引位移下来填充已删除属性留下的空白,删除一个元素,数组变成稀疏数组。
pop()和shift()从数组尾部和头部删除数据
删除数据后,length也跟着变化
7.6 数组遍历
最常用for循环遍历数组
使用数组元素之前检测它们,想要排除null,undefined和不存在的元素
for...{
if(!a[i]) continue;//跳过null,undefined和不存在的元素
}
forEach()使数组拥有简单而强大的函数式编程风格
x是遍历的时候,每一项的值
7.7 多维数组
不真的支持,但可以用数组的数组来近似表示。
两次[]来表示,访问特定数值matrix[x][y].
7.7.1使用二维数组作为九九乘法表
7.8 数组方法
7.8.1 join()
Array.join()方法将数组中所有元素都转化为字符串并连接在一起,返回最后生成的字符串。
可以指定一个可选的字符串来分割数组的各个元素,如果不指定,则用逗号。
Array.join()方法是String.split()方法的逆向操作,后者是将字符串分割成若干块来创建一个数组。
7.8.2 reverse()
Array.reverse()方法将数组的元素颠倒顺序,返回逆序数组,采取替换,并没有重新创建数组。
7.8.3 sort(),将数组中元素排序并返回数组
以字母表顺序排序
按照其他排序需要传递一个比较器,两个参数的函数,并返回一个 正数,负数,或0.
7.8.4 concat(),连接多个数组并返回新数组
7.8.5 slice(s,e),指定数组的片段
两个参数包左不包右
7.8.6 splice(),插入或删除元素
第一个参数表示出入或删除的起始位置,第二个参数表示从数组中删除的个数
前两个参数指定了需要删除的数组元素,后面紧跟多个需要插入的元素
7.8.7 push()和pop()
已了解,末尾增删,可以当做栈来用,先进后出。
7.8.8 unshift()和shift()
同上,首部的增删。
7.8.9 toString()和toLocaleString()
任何对象都有toString()方法,将每个元素转换为字符串用逗号隔开输出。
toLocaleString()是toString()本地化版本