数组Array是引用类型的一种,属于对象类型。本文整理了一些常用的方法,在面试中也是高频考点。
一、创建数组的方法
- 使用Array构造函数
var arr1 = new Array();//创建了一个空数组 var arr2 = new Array(10);//创建了一个长度为20的数组 var arr3 = new Array("CD", 21 , "m");//创建了一个具有初始化数据的数组
- 使用数组字面量
var arr1 = [];// [],创建了一个空数组 var arr2 = [10];// [10],创建了一个只有一项的数组 var arr3 = [10,20,30];// [10,20,30] //向数组中添加项 arr1[1] = true; arr3[3] = 40; console.log(arr1);//[true] console.log(arr3);//[10,20,30,40]
数组中存储的数据可以是任何类型的。
二、数组的length属性
length属性可以返回数组的长度,也可以通过操作length属性来改变数组的长度。
var arr = [1,2,3];
console.log(arr[4]);//undefined
arr.length = 4;
console.log(arr);//[1,2,3,empty]
console.log(arr[4]);//undefined
三、检测数组
typeof;
arr.isArray();
arr instanceof Array;
arr constructor === Array;
Array.prototype.isPrototypeOf(arr);
Object.getPrototypeOf(arr) === Array.prototype;
Object.prototype.toString.apply(arr) === "[object Array]";
四、数组API(一):转换方法、栈方法、队列方法、排序方法、操作方法、位置方法
- join():将数组转为字符串,参数为分隔符。不改变原数组,返回一个字符串。
var arr = [true,21,"study"]; console.log(arr.join());//true,21,study console.log(typeof arr.join());//string console.log(arr.join(""));//true21study console.log(arr);//[true, 21, "study"]
-
toString():返回数组中每项的字符串形式。( toLocaleString() )
-
valueOf():返回数组本身(对象的原始值)
-
push():依次添加n项到数组末尾,参数为任意数量和类型的数据。改变原数组,返回新数组的length。
var arr = [10,20,30]; console.log(arr.push(40,50));//5 console.log(arr);//[10,20,30,40,50]
-
pop():移除数组的最后一项,无参数。改变原数组,返回被移除的那一项。
var arr = [20,30,40]; console.log(arr.pop());//40 console.log(arr);//[20,30]
-
shift():移除数组的第一项,无参数。改变原数组,返回被移除的那一项。
var arr = [20,30,40]; console.log(arr.shift());//20 console.log(arr);//[30,40]
-
unshift():依次添加n项到数组前端,参数为任意数量和类型的数据。改变原数组,返回新数组的length。
var arr = [30,40,50]; console.log(arr.unshift(10,20));//5 console.log(arr);//[10,20,30,40,50]
-
reverse():反转数组项的顺序,无参数。不改变原数组,返回新数组。
var arr = [1,2,3,4,5]; console.log(arr.reverse());//[5,4,3,2,1] console.log(arr);//[1,2,3,4,5]
-
sort():按照字符串UniCode码排序。不改变原数组,返回新数组。
var arr = [-4,19,6,30]; //直接使用sort() console.log(arr1.sort());//[-4, 19, 30, 6] //从小到大排序 console.log(arr.sort(function (a, b){ return a - b; }));//[-4,6,19,30] //从大到小排序 console.log(arr.sort(function (a, b){ return b - a; }));//[30,19,6,-4] //按照数组中对象的某一项的值进行排序 var newArr=[ {name:"ll",age:"3"}, {name:"a",age:"5"}, {name:"lh",age:"0"} ]; function compare(arg){ return function (a,b) { return a[arg]-b[arg]; } } console.log(newArr.sort(compare("age"))); //这个用途是曾经在一个博客上看到的,数组对象中age的值只能用“”包起来才能生效,否则这个方法无效。
-
concat():基于当前数组创建新数组,参数为任意数量和类型的数据。不改变原数组,返回新数组。
var arr=[1,3,5,7,9]; console.log(arr.concat(11,[12]));//[1,3,5,7,9,11,[12]] console.log(arr);//[1,3,5,7,9] //若concat()不传任何参数,则相当于复制了一个原数组 console.log(arr.concat());//[1,3,5,7,9]
-
slice():删除原数组中指定元素,参数为要删除项的起始索引和结束索引,结束索引对应的项不被删除且为可选参数。不改变原数组,返回被删除的元素组成的数组。若参数为负数,则加上数组长度后再计算。
var arr = [1,2,3,4,5,6,7,8,9]; console.log(arr.slice(4));//[5,6,7,8,9] console.log(arr.slice(4,6));//[5,6] console.log(arr);//[1,2,3,4,5,6,7,8,9] console.log(arr.slice(-3,-1));//[7,8]
-
splice():删除或替换原数组中的项。参数有三个:要删除项的起始索引、要删除的项数、要插入的项,第三个参数可选。改变原数组,返回被删除的元素组成的数组。
var arr = [1,2,3,4,5]; console.log(arr.splice(2,3,6,7));//[3,4,5],替换 console.log(arr.splice(2,2));//[6,7],删除 console.log(arr.splice(2,0,8,9));//[],插入 console.log(arr);//[1,2,8,9] //清空数组 arrc = [3,4,5]; arrc.splice(0); console.log(arrc);//[]
-
indexOf():从数组的前端开始向后查找,参数为要查找的项和开始查找位置的索引(可选)。不改变原数组,返回要查找的项在数组中的位置索引,没找到就返回-1。
var arr = [2,4,6,8,8,6,4,2]; console.log(arr.indexOf(4));//1 console.log(arr.indexOf(4,1));//1 console.log(arr.indexOf(4,2));//6
-
lastIndexOf():从数组的末尾开始向前查找,参数为要查找的项和开始查找位置的索引(可选)。不改变原数组,返回要查找的项在数组中的位置索引,没找到就返回-1。
var arr = [2,4,6,8,8,6,4,2]; console.log(arr.lastIndexOf(8,2));//-1 console.log(arr.lastIndexOf(8,3));//3
- indexOf()和lastIndexOf(),在查找时,都会使用严格相等判断要查找的项是否与数组每一项的值及类型都相等,都相等才能查到,否则返回-1。
五、数组API(二):迭代方法、归并方法
以下这5种方法的参数都是:要对数组中的每一项运行的函数、运行该函数的作用域对象(可选,会影响this的值)。而传入方法的函数的参数为:数组项的值、该项在数组中的位置、数组对象本身。
- every():判断数组中的每一项是否满足条件,所有项都满足条件就返回true,否则返回false。
var arr = [2,4,5,6,8,9]; console.log(arr.every(function (value){ return value < 5; }));//false
- filter():判断数组中的每一项是否满足条件,具有过滤功能,返回满足过滤条件的项组成的数组。
var arr = [1,2,3,4,5,6,7,8,9]; console.log(arr.filter(function (value,index) { return value % 3 === 0 && index > 6; }));//[9]
- forEach():对数组进行循环遍历,无返回值。
var arr = [1,3,5,7,9]; arr.forEach(function (value,index){ console.log(value+index);//1--4--7--10--13 }); //若返回上面这段代码,将会得到undefined
- map():映射,返回每次函数调用的结果组成的数组。
var arr = [2,4,6,8,10]; console.log(arr.map(function (value,index){ return index*index+value; }));//[2, 5, 10, 17, 26]
- some():判断数组中是否存在满足条件的值,只要有一项满足条件,就返回true,否则返回false。
var arr = [0,2,4,6,8]; console.log(arr.some(function (value){ return value % 3 === 0; }));//true
以下这两种方法的参数都是:一个在数组每一项上都调用的函数、作为归并基础的初始值(可选)。而传入方法的函数的参数:前一个值、当前值、项的索引、数组对象。该函数返回的值将作为下一项运行该函数时的第一个参数。
- reduce():从数组的第一项开始逐个向后到最后一项。
var arr = [1,2,3,4,5]; console.log(arr.reduce(function (pre, cur, index, array){ return pre + cur; }));//15 //该函数用之于该方法,达到数组求和的功能。
- reduceRight()从数组的最后一项开始向前遍历到第一项。
var arr = [1,2,3,4,5]; console.log(arr.reduce(function (pre, cur, index, array){ return pre + cur; }));//15 //该方法与正向遍历相同,只是顺序不同。此题中可达到相同的效果。