在javascript中,数组可以使用Array构造函数来创建,或使用[]快速创建,这也是首选的方法。数组是继承自Object的原型,并且他对typeof没有特殊的返回值,他只返回'object'。
var arr = new Array();
var arr = [1,2,3,4,5];
1 .join()
separator:分割符
将数组组合成一个字符串,不传separator(分隔符)参数便会默认用逗号分隔,反之用传入参数的分隔符分隔。
var arr= [1,2,3]
arr.join()//"1,2,3"字符串
arr.join("-")//"1-2-3"字符串
join()可以配合Array()方法实现重复字符串
function repeatString(n,str){
return new Array(n+1).join(str);
}
repeatString("abc",3);//"abcabcabc"
2 .push()和pop()
push()可以接受任意个参数,将他们逐个加到数组的末尾,并返回修改后的数组长度。
pop()可以将数组末尾最后一项移除并返回出来。
var arr =["a","b","c"];
var count = arr.push("d","e");
console.log(arr)//["a","b","c","d","e"]
console.log(count)//5
var item = arr.pop();
console.log(item)//e 此时arr为["a","b","c","d"]
pop()是无参数的,即便带了参数也是删除最后一项。
3 .shift()和unshift()
shitf():删除原数组第一项并返回出去,如果数组为空则返回undefined
unshitf():将参数添加到原数组开头、并返回数组的长度。
形同push()和pop(),一个操作开头一个操作结尾。
var arr =["c","d","e"];
var count = arr.unshift("a","b");
console.log(arr)//["a","b","c","d","e"]
console.log(count)//5
var item = arr.shift();
console.log(item)//a 此时arr为["b","c","d","e"]
4 .sort()
sort():按数组项的.toString()得到的字符串升序排序。
这意味着12会在7前面,因为比较的是12的“1”和7的“7”。
var arr1 = ["d","a","b","c"];
console.log(arr1.sort());//["a","b","c","d"]
var arr2 = [12,24,7,41];
console.log(arr2.sort());//[13,24,41,7]
sort()为了解决数字排序的问题,提供了一个参数可以接受一个比较函数,以前后两数之差来判断谁前谁后。
function compare(value1,value2){
return value1-value2;
}
var arr= [13,51,3,20,43];
console.log(arr.sort(compare));//[3,13,20,43,51]
5 .reverse()
reverse():反转数组项的顺序。
var arr = ["a","b","c"];
console.log(arr.reverse());//["c","b","a"] arr数组也同样
6 .concat()
concat():将参数添加到原数组中。这个方法会先创建当先数组的一个副本,然后将参数加到这个副本的末尾构成新数组并返回,在没有传参的情况下只是复制当先数组并返回副本。
var arr = [1,2,3,4];
var arrCopy = arr.concat(5,[6,7]);
console.log(arrCopy);//[1,2,3,4,5,6,7]传入数组也会被拆分拼接上
console.log(arr);//[1,2,3,4]原数组没有改变
concat中参数的数组拆分只有一维。
var arr = [1,2,3,4];
var arrCopy = arr.concat([5,[6,7]]);
console.log(arrCopy);//[1,2,3,4,5,Array[2]]传入二维数组后 cancat只能做一次拆分
console.log(arrCopy[5]);//[6,7]
7 .slice()
接受一到两个参数,接受一个起始位置的下标和结束位置的下标,返回中间截取的新数组。
一个参数会返回到数组末尾,两个参数时,指定结尾下标的元素不会被返回。传入负数时会从末尾开始往前算。
var arr = [1,2,3,4,5,6];
var arrCopy1 = arr.slice(1);
var arrCopy2 = arr.slice(1,4);
var arrCopy3 = arr.slice(1,-2);
var arrCopy4 = arr.slice(-4,-1);
console.log(arr)
console.log(arrCopy1);//[2,3,4,5,6]
console.log(arrCopy2);//[2,3,4]
console.log(arrCopy3);//[2,3,4]
console.log(arrCopy4);//[3,4,5]
8 .splice()
splice()方法可以做到删除、插入、替换;
删除:splice()接受两个参数,要删除的第一项和要删除的项数。
插入:splice()接受三个参数,起始位置、要删除的项数(做插入操作时为0)、要插入的任意个项。
替换:同插入,传入要删除的项数,无需与插入项数相等。
splice()会返回一个包含删除的项的数组,如果没有删除项则是一个空数组。
var arr = [1,2,3,4,7];
var arrRemoved = arr.splice(0,2);
console.log(arr);//[3,4,7]
console.log(arrRemoved);//[1,2]
var arrRemoved2 = arr.splice(2,0,5,6);
console.log(arr);//[3,4,5,6,7]
console.log(arrRemoved2);//[]
var arrRemoved3 = arr.splice(1,1,1,2);
console.log(arr);//[3,1,2,5,6,7]
console.log(arrRemoved3 );//[4]
9. indexOf()和lastIndexOf()
indexOf():接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的开头(位置 0)开始向后查找。
lastIndexOf:接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的末尾开始向前查找。
这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1。在比较第一个参数与数组中的每一项时,会使用全等操作符。
var arr= [1,2,3,4,5,4,3,2,1]
console.log(arr.indexOf(4));//3
console.log(arr.lastIndexOf(4));//5
console.log(arr.indexOf(4,3));//3
console.log(arr.lastIndexOf(4,4));//3
console.log(arr.indexOf("4"));//-1
10 .遍历方法
for()的两种用法
for(var i=0;i<arr.length;i++){
console.log(arr[i]);
}
for(var j in arr){
console.log(arr[j]);
}
11 .迭代方法
1. forEach()给数组每一项给定函数,该方法没有返回值。
var arr= [1,2,3,4,5]
arr.forEach(function(item,index,array){
console.log(index+'-'+item+'-'+array);
})
/*
0-1-1,2,3,4,5
1-2-1,2,3,4,5
2-3-1,2,3,4,5
3-4-1,2,3,4,5
4-5-1,2,3,4,5
*/
2 .some():对数组中的每一项运行给定函数,如果该函数对任一项返回true,则返回true。
var arr= [1,2,3,4,5]
var boo = arr.some(function(value){
return value>3;
})
console.log(boo);//true
3 every():与some()相反,有任一项返回false,则返回false,反之全部为true则返回true.
var arr= [1,2,3,4,5]
var boo = arr.every(function(value){
return value>3;
})
console.log(boo);//false
4. filter():对数组的每一项运行给定函数,返回该函数会返回true项组成的数组。
var arr= [1,2,3,4,5]
var a = arr.filter(function(value){
return value>3;
})
console.log(a);//[4,5]
a[1] = 6;
console.log(a);//[4,6]
console.log(arr);//[1,2,3,4,5]
5. map():对数组的每一项给定函数,返回每次函数调用的结果组成数组。
var arr= [1,2,3,4,5]
var a = arr.map(function(value){
return value*3;
})
console.log(a);//[ 3, 6, 9, 12, 15 ]
a[1] = 100;
console.log(a);//[ 3, 100, 9, 12, 15 ]
console.log(arr);//[1,2,3,4,5]
对新数组的操作都不会影响原来的数组。
12. ES5新增迭代方法
ES5新增两个归并数组的方法,reduce()和reduceRight()。这两个方法都会迭代数组所有项,然后构建一个返回值。
这两个方法都能接收两个参数:一个在每一项上调用的函数和(可选)作为归并的初始值。
var arr= [1,2,3,4,5];
var sum = arr.reduce(function(pre,cur,index,array){
console.log("index:"+index+" pre:"+pre+" cur:"+cur);
return pre+cur;
},10)
/*
index:0 pre:10 cur:1
index:1 pre:11 cur:2
index:2 pre:13 cur:3
index:3 pre:16 cur:4
index:4 pre:20 cur:5
*/
var sumr = arr.reduceRight(function(pre,cur,index,array){
console.log("index:"+index+" pre:"+pre+" cur:"+cur);
return pre+cur;
},10)
/*
index:4 pre:10 cur:5
index:3 pre:15 cur:4
index:2 pre:19 cur:3
index:1 pre:22 cur:2
index:0 pre:24 cur:1
*/
console.log(arr);//[ 1, 2, 3, 4, 5 ]
console.log(sum);//25
console.log(sumr);//25
在不传入归并初始值参数时,第一次迭代会传入两个数组项。
var arr= [1,2,3,4,5];
var sum = arr.reduce(function(pre,cur,index,array){
console.log("index:"+index+" pre:"+pre+" cur:"+cur);
return pre+cur;
})
/*
index:1 pre:1 cur:2
index:2 pre:3 cur:3
index:3 pre:6 cur:4
index:4 pre:10 cur:5
*/
var sumr = arr.reduceRight(function(pre,cur,index,array){
console.log("index:"+index+" pre:"+pre+" cur:"+cur);
return pre+cur;
})
/*
index:3 pre:5 cur:4
index:2 pre:9 cur:3
index:1 pre:12 cur:2
index:0 pre:14 cur:1
*/
console.log(arr);//[ 1, 2, 3, 4, 5 ]
console.log(sum);//15
console.log(sumr);//15
13 .原数组变化或非变化分类
变化:push()和pop(),shift() 和 unshift(),sort(),splice()
非变化:join(),concat(),slice(),indexOf()和 lastIndexOf() (ES5新增),forEach() (ES5新增),some() (ES5新增),fliter() (ES5新增),map() (ES5新增),every() (ES5新增),reduce()和 reduceRight() (ES5新增)