前端宝典【犀牛书】06(数组)
数组
数组的索引是小于于2^32且非负的整数;
数组索引访问属性比对象访问属性要快;
创建数组
字面量创建数组var b=[2,23]
构造函数创建数组 var a=new Array()
稀疏数组:稀疏数组比稠密数组更慢,内存利用率高,与常规对象查询时间一样长
a=new Array(5);
a=[ ],a[100]=0;
可以用in来检测是否稀疏数组
数组索引为i,length为i+1
当改变length时,将删除索引值大于等于n的元素
创建一个数组a,
Object.defineProperty(a,"length",{wirtable:false})
a.length=0就不可修改
多维数组(二维为列,就是数组元素里面包含数组)
// 创建 一个 多维 数组
var table = new Array( 10); // 表格 有 10 行
for( var i = 0; i < table. length; i++) table[ i] = new Array( 10); // 每 行 有 10 列 // 初始化 数组
for( var row = 0; row < table. length; row++) {
for( col = 0; col < table[ row]. length; col++) {
table[ row][ col] = row* col;
}
} // 使用 多维 数组 来 计算( 查询)
5* 7 var product = table[ 5][ 7]; // 35
delete运算符在数组中不改变数组长度,pop(),push(),shift(),unshift()会改变数组长度
循环遍历一般用for循环,for/in会直接排除不存在的索引,也会带来继承的属性遍历;并且不能保证遍历顺序是按索引来,而有可能是按创建顺序
数组方法
jion(与不带参数的toString功能相同):
eg:var a=[1,2,3]
a. join(""); // => "123"
reverse:生成逆序数组,(改变数组)
sort:进行数组排序按字母顺序,(改变数组)
concat:合并数组不会递归数组,最外层的数组全都可去
slice:(startIndex,endIndex)包头不包尾部,可以是负数,最后一位表示为-1
splice(startIndex,deleteLength,元素1,元素2),(改变数组)
pop()返回删除元素,push()返回数组长度,shift(),unshift()(改变数组)
es5数组方法
forEach:不可被中断,没有返回值
map:有返回值,返回新数组(稀疏数组不改变稠密度)
filter:返回条件转换为true的元素(稀疏数组改变稠密度)
every返回第一个false,some返回第一个true
eg:在空数组上调用时, every() 返回 true, some() 返回 false。
reduce, reduceRight
eg:不调用简化函数
数组中一个元素,没初始值;数组中没有元素,有初始值;
indeOf(元素,startIndex),找到返回找到的第一个元素的索引,没找到返回-1
Array.isArray([ ])实现方案
var isArray = Function. isArray || function( o) {
return typeof o === "object" && Object. prototype. toString. call( o) === "[object Array]";
};
类数组对象 var a = {"0":" a", "1":" b", "2":" c", length: 3};
字符串作为数组,用Fuction.call实现对数组方法调用
s = "JavaScript" Array. prototype. join. call( s, " ") // => "J a v a S c r i p t"
Array. prototype. filter. call( s, // 过滤 字符串 中的 字符
function( x) { return x. match(/[^ aeiou]/); // 只 匹配 非 元音 字母 }
).join("") // => "JvScrpt"
注:字符串为不可变值push()、 sort()、 reverse() 和 splice() 等 数组 方法 会 修改 数组