JavaScript权威指南(第6版)(中文版)--系列5(数组)
7.1 创建数组
var empty=[]; //没有元素的数组。
var primes = [2,3,5,7,11] // 有5个数值的数组。
var misc =[1.1,true,"a", ] // 3个不同类型的元素和结尾的逗号。
7.2 数组元素的读和写。
7.3 稀疏数组。
稀疏数组就是包含从0开始的不连续索引的数组。
7.4 数组长度
7.6 数组遍历。
for(var i=0;i<keys.length;i++){ //对于数组中每个索引
var key = keys[i]; // 获得索引处的键值。
values[i] = o[key] // 在values 数组中保存属性值
}
在嵌套循环或其他性能非常重要的上下文中,可以看到这种基本的数组遍历需求优化,数组的长度应该只查询一次而非每次循环都要查询。
for(var i=0,len = keys.length;i<len;i++){
// 循环体任然不变
}
// 循环排除null、undefined和不存在的元素。
for(var i=0;i<a.length;i++){
if(!a[i]) continue; // 跳过null、undefined和不存在的元素
//循环体
}
7.7 多维数组
7.8 数组方法
7.8.1 join()
将数值中所以元素都转化为字符串并连接在一起,返回最后生成的字符串。
var a = [1,2,3]; //创建一个包含三个元素的数组。
a.join(); // "1,2,3";
a.join(" "); // "1 2 3";
a.join("") //"123";
var b = new Array(10); // 长度为10的空数组
b.join('-') // '---------------' 9个连字号组成的字符串。
7.8.2 reverse(); //回改变原来的数组
Array.reverse() 方法将数组中的元素颠倒顺序,返回逆序的数组。
var a = [1,2,3];
a.reverse().join() //"3,2,1"并且现在的a是 [3,2,1]
7.8.3 sort()
Array.sort() 方法将数组中的元素排序并返回排序后的数组。当不带参数调用sort()时,数组元素以字母表顺序排序。
var a = new Array("banana","cherry","apple");
a.sort();
var s = a.join(",") // s =="apple, banana, cherry"
var a = [33,4,1111,222];
a.sort(function(a,b)){
return a-b; //根据顺序,返回负数,0,正数
}
7.8.4 concat()
Array.concat()方法创建并返回一个新数组,它的元素包括调用concat()的原始数组的元素和concat()的每个参数。
var a=[1,2,3];
a.concat(4,5) //返回[1,2,3,4,5]
7.8.5 slice();
Array.slice()方法返回指定数组的一个片段或子数组。它的两个参数分别指定了片段的开始和结束的位置。
var a=[1,2,3,4,5];
a.slice(0,3); // 返回 [1,2,3]
a,slice(3); // 返回[4,5]
a.slice(1,-1) // 返回[2,3,4];
a.slice(-3,-2) //返回[3]
7.8.6 splice()
Array.splice 方法是在数组中插入或删除元素的通用方法。不同于slice()和concat(),splice()会修改调用的数组。
splice()能够从数组中删除元素,插入元素到数组中或同时完成这两种操作。
var a = [1,2,3,4,5,6,7,8];
a,splice(4); //返回[5,6,7,8] // a是[1,2,3,4];
a.splice(1,2) //返回[2,3]; a是[1,4];
a.splice(1,1) //返回[4] a是[1]
注意,区别于concat(),splice 会插入数组本身,而非数组的元素。
splice()的前两个参数指定了需要删除的数组元素。紧随其后的任意个数的参数指定了需要插入到数组中的元素,
var a = [1,2,3,4,5];
a.splice(2,0,'a','b') // 返回 []; a是[1,2,'a','b',3,4,5];
a.splice(2,2,[1,2],3); // 返回['a,','b']; a是[1,2,[1,2],3,3,4,5];
7.8.7 push()和pop()
方法允许将数组当做zh 来使用。push()方法在数组尾部添加一个或多个元素,并返回数组新的长度。pop()方法则相反:它删除数组的最后一个元素,减少数组长度并返回它删除的值。
注意,两个方法都修改并替换原始数组而生成的一个修改版的新数组。
var stack = []; //stack:[]
stack.push(1,2) // stack[1,2] 返回2
stack.pop(); // stack[1] 返回2
stack.push(3) // stack[1,3] 返回2
stack.pop(); // stack[1] 返回3
stack.push([4,5]); // stack[1,[4,5]] 返回2
stack.pop(); // stack[1] 返回[4,5]
stack.pop(); // stack[] 返回1
7.8.8 unshift()和shift()
类似push()和pop(),不一样的是前者是在数组的头部而非尾部进行元素的插入和删除操作。
7.8.9 toString() 和toLocaleString()
该方法将其每个元素转化为字符串。
[1,2,3].toString() // 生成'1,2,3'
["a","b","c"].toString() // 生成'a,b,c'
[1,[2,'c']].toString() // 生成'1,2,c'
7.9 ECMAScript5 中的数组方法。
7.9.1 forEach()
从头到尾遍历数组,为每个元素调用指定的函数。 三个参数:数组元素、元素的索引、数组本身。
var data = [1,2,3,4,5]; //要求和的数组
//计算数组元的和值
var sum =0; //初始为0
data.forEach(function(value){ sum+=value; } ); //将每个值累加到sum上
sum // 15
//每个数组元素的值自加1
data.forEach(function(v,i,a){a[i]=v+1});
data // [2,3,4,5,6]
7.9.2 map()
将调用的数组的每个元素传递给指定的函数,并返回一个数组,它包含该函数的返回值。
a = [1,2,3];
b=a.map(function(){ return x*x; }); // b 是 [1,4,9];
7.9.3 filter()
返回数组元素是调用的数组的一个子集。传递的函数是用来逻辑判定的。该函数返回true或false。
a=[5,4,3,2,1];
smallvalues = a.filter( function(x) { return x<3 }); // [2,1];
everyother = a.filter( function(x,i) { return i%2==0 } ); // [5,3,1];
7.9.4 every()和some()
是数组的逻辑判定:他们对数组元素应用指定的函数进行判定,返回true或false。
a = [1,2,3,4,5];
every() 所有的元素判断。
a.every(function(x){ return x<10; }) // true: 所有的值<10;
a.every(function(x){return x%2 === 0}) // false 不是所有的值都是偶数。
some(),当数组中至少有一个元素调用判定函数返回true,他就是true
a= [1,2,3,4,5]
a.some(funcion(x){ return x%2 === 0 }) // true a含有偶数值。
a.some(isNaN) // false a 不包含非数值元素。
7.9.5 reduce() 和reduceRight()
使用指定的函数将数组元素进行组合,生成单个值。
var a = [1,2,3,4,5];
var sum = a.reduce(function(x,y){return x+y},0); //数组求和
var product = a.reduce(function(x,y){ return x*y},1); // 数组求积
var max = a.reduce(function(x,y){ return (x>y)?x:y;}) ; 求最大值
7.9.6 indexOf()和lastIndexOf();
搜索整个数组具有给定值的元素,返回找到的第一个元素的索引或者没有找到就返回-1。
a = [0,1,2,1,0];
a.indexOf(1) // 1:a[1]是1
a.lastIndexOf(1) // 3 a[3]是1
a.indexOf(3) // -1 没有值为3的元素。
7.10 数组类型
Array.isArray() 函数