本文介绍的数组一共有以下这些:
isArray(a)~toString()~toLocaleString()~join()~valueOf()~push()~unshift()~pop()~shift()~reverse()~sort()~concat()~slice()~splice()~copyWithin()~fill()~indexOf(search,start)~lastIndexOf()~reduce()~reduceRight()~map()~forEach()~keys()~values()~entries()~filter()~some()~every()
数组的基本方法
isArray(a):判断a是否是数组
toString():返回由数组中每个值以逗号分隔的字符串,和join()不传参时候相同
[1,2].toString()//"1,2"
[1,null,2,undefined,3].tostring()//"1,,2,,3"
toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。大体上和toString一样
插播toString()和toLocaleString()区别:
//字符串:当数字是三位以上时,会每三位出现一个分隔号
var a = 6666
a.toLocaleString()//"6,666"
a.toString()//"6666"
//日期:
var dt = new Date()
dt.toLocaleString()//"2021/5/26下午2:14:41"
/*
注:
1 这里是当前区域设置的默认格式(用户的“控制面板”中“区域设置”)表示的日期
2 toLocaleString只是用来显示结果给用户;最好不要在脚本中用来做基本计算,因为返回的结果是随机器不同而不同的。
3 使用toString()是保险的方法,它不会因为本地环境改变而改变;
*/
dt.toString()//"Wed May 26 2021 14:14:41 GMT+0800 (中国标准时间)"
join():接收一个参数,用作分隔符,默认是逗号,可用于有length属性的类数组对象上
[1,null,2,undefined,3].join('~')//"1~~2~~3"
//使用join()方法可以创建重复某些字符N次的函数
Array(7).join('lct')//"lctlctlctlctlctlct"
valueOf():返回数组对象的本身
[1,null,2,undefined,3].valueOf()//[1, null, 2, undefined, 3]
var o = {
valueOf: function(){
return -1;
}
};
o = +o;//-1
/*
解析:valueOf()方法和toString()方法是一样的,都会在后台进行隐式的调用
在 o = +o时,等号右边就已经调用了valueOf(),相当于 o = +(-1);所以,最终结果o为-1.
*/
数组的插入或者移除
push():可以接收任意数量的参数,把它们逐个添加到数组末尾,并返回修改后数组的长度。该数组会改变原数组
[1,2].push(4)//打印的3,是数组的长度,原数组变成[1,2,4]
pop():从数组末尾移除最后一项,然后返回移除的项。该数组会改变原数组
[2,3,5].pop()//打印出5,原数组变成[2,3]
[].pop()//打印出undefiend,不会报错
shift():移除数组中的第一个项并返回该项。该数组会改变原数组
[1,3,4].shift()//打印出1,原数组变成[3,4]
[].shitl()//打印出undefined,不会报错
unshift():可以接收任意数量的参数,在数组前端添加任意个项并返回新数组长度。该数组会改变原数组
[1,3,4].unshift(2,4,6)//打印出6,原数组变成[2,4,6,1,3,4]
//注:在IE7-浏览器中,unshift()方法返回的总是undefined
排序方法
reverse():用于反转数组的顺序,返回经过排序之后的数组;而原数组顺序也发生改变
[1,3,4,5].reverse()
//打印出[5, 4, 3, 1],原数组变成了[5, 4, 3, 1]
sort():按字符串升序排列数组项,sort方法会调用每个数组项的toString()方法,然后比较得到的字符串排序,返回经过排序之后的数组,而原数组顺序也发生改变,它可以接收一个function作为比较函数
[1,7,4,3].sort()//打出[1, 3, 4, 7],原数组也改变了
var a = [1,undefined,'A',4,'lct',7,null,'hh',2]
a.sort()
console.log(a)//[1, 2, 4, "A", "hh", "lct", null, undefined]
拼接方法
concat():将接收到的参数添加到这个数组的末尾,最后返回新构建的数组。不影响原数组。属于浅拷贝
创建子数组方法
slice():接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组,不影响原数组
[1,2,4,null,undefined,'lct'].slice(0,2)//打出[1,2]
/*
注:
返回这个数组中从start位置到(但不包含)end位置的一个子数组
如果start是负数,则start = max(length + start,0)
如果end是负数,则end = max(length + end,0)
*/
数组删改方法
splice(start,end):用于删除原数组的一部分成员,并可以在被删除的位置添加入新的数组成员,该方法会改变原数回
- 一个由删除元素组成的数组,或者如果没有删除元素就返回一个空数组
- 第一个参数start指定了插入或删除的起始位置
- 如果start是负数,则start = max(length + start,0);
- 如果start是NaN,则相当于start = 0
- 第二个参数number指定了应该从数组中删除的元素的个数。
- 如果省略第二个参数,从起始点开始到数组结尾的所有元素都将被删除。
- 如果number是负数或NaN或undefined,则number=0,因此不删除元素
- 如果后面还有更多的参数,则表示这些就是要被插入数组的新元素
copyWithin():用于从数组的指定位置拷贝元素到数组的另一个指定位置中。可传三个参数var arr = [1,2,4,null,undefined,'lct'] var arr2 = arr.splice(0,4,7,8) arr//原数组变成[7,8,undefined,'lct'] arr2//返回的是被删除的元素,所以是[1,2,4,null]
- 1必填,是复制指定目标索引位置
- 2选填,元素复制的起始位置。默认为 0 ,如果为负值,表示倒数
- 3选填,表示结束复制的元素索引位置,默认是数组的长度,注:不包含最后一个索引元素。
[0,1, 2, 3, 4, 5].copyWithin(0, 3, 4)
//把3(包含3)到4(不包含4)位复制到0位,也就是把3复制到0,就变成[3,1,2,3,4,5]
[1, 2, 3, 4, 5].copyWithin(0, -2, -1)
//把-2(也就是4,包含4)位到-1(也就是5,不包含5)位,复制到0位,变成[4,2,3,4,5]
fill() :用于将一个固定值替换数组的元素。可将一个数组中的部分或者全部内容替换为一个你想要的固定值
array.fill(value, start, end)
value替换的值
start替换的开始的位置,包含开始索引位置
end替换的结束的位置,不包含结束索引位置
[0,1,2,3,4,5,6].fill('lct', 2, 4)
//[0, 1, "lct", "lct", 4, 5, 6]
数组位置方法
indexOf(search,start):接收search和start两个参数,返回search首次出现的位置,start参数表示该搜索的开始位置,如果没有找到则返回-1(使用严格相等运算符(===)进行比较)
lastIndexOf():与indexOf()同,lastIndexOf()从右向左查找,其它一样
数组归并方法
reduce():方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。需要两个参数。第一个是执行化简操作的函数。第二个(可选)是一个传递给函数的初始值
var a = [1,2,3,4,5];
var sum = a.reduce(function(x,y){
return x+y
},0);//数组求和,0是sum的初始值
console.log(sum)
/*
如果没有指定后面的0,那么第一次x和y是1和2,第二次x是1+2的结果y是3,第三次x是3+3y是4.....
如果指定了后面的0,那么第一次x就是0和y是1,第二次x就是0+1和y就是2.....
*/
reduceRight():工作原理和reduce()一样,不同的是它按照数组索引从高到低(从右到左)处理数组,而不是从低到高
数组迭代方法
总共有5个方法,每个方法都接收两个参数:
- 要在每一项上运行的函数
传入这些方法中的函数会接收三个参数:
数组项的值
该项在数组中的位置
数组对象本身
- (可选的)运行该函数的作用域对象——影响this的值。
[1,2,3].map( function (item,index,arr){ console.log(this)//this指向的是[7,8],如果没有第二个参数指向window console.log(arr)//这是数组本身,也就是[1,2,3] return item*index},[7,8]);//[0,2,6]
map():数组映射
[1,2,5].map(function(a,b){
return a+b
})
var arr = [1,2,4]
var c = arr.map(function(a,b){
return a+b
})
console.log(c)// [1, 3, 6]
console.log(arr)// [1, 2, 4]
新数组是[1,3,7]
filter():筛选后返回新数组
var arr = [1,2,4]
var c = arr.filter(function(a,b){
return a+b
})
console.log(c)// [1, 2, 4]
console.log(arr)//[1, 2, 4]
//新数组是[2,3]
遍历数组:
forEach():用于数组的循环
[1,2,3,'lct'].forEach(function(a,v){
console.log(a+'|'+v)//循环打印出1|0 2|1 3|2 lct|3
})
keys(),values(),entries()它们都返回一个遍历器对象,可以用for...of循环进行遍历
keys():返回 [键]
values():返回 [值]
entries():返回 [[键,值],[键,值]]
for (let index of ['a', 'b',2,4,5].entries()) {
console.log(index);
}
some():遍历整个数组如果有一项是ture,则返回true。并且当且仅当数值中的所有元素调用判定函数都返回false,它才返回false
a = [1,2,3,4,5];
a.some(function(elem, index, arr){return elem%2===0;})//true
[].some(function(){});//false
every():和some用法一样,但是every是每一项都是tuue才返回true,只要有一项是false,则返回false
[].every(function(){});
//true,在空数组上调用every()方法会返回true
总:可以改变原数组的方法总共有9种:包括unshift()、shift()、push()、pop()这4种栈和队列方法,reverse()和sort()这2种数组排列方法,数组删改方法splice() fill() copy within()