1.join
join方法以传入参数作为分隔符,将数组成员全部连接起来,构成一个字符串.(如果中间有空位,也会被转化为字符串'')
let arr = [1,2,3,4,5]
arr.join('/') // '1/2/3/4/5'
let ar = [1,,3,4]
ar.join('-') // '1--3-4'
由此,join方法我们可以推测它的基本实现:
function join(str) {
let result = this[0] || result
let length = this.length
for (let i = 1; i < length; i++) {
result += str + this[i]
}
return result
}
2.slice
slice用于截取数组的一部分,然后将该部分数组返回一个新的数组.
arr.slice(start, end)
它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。如果省略第二个参数,则一直返回到原数组的最后一个成员。如果slice方法的参数是负数,则表示倒数计算的位置。
let arr = [1,2,3]
arr.slice(0) // [1,2,3]
arr.slice(1,2) // [2]
arr.slice(-2) // [2,3]
slice的简单实现:
function slice(begin, end) {
let result = []
begin = begin || 0
end = end || this.length
for(let i = start; i < end; i++){
result.push(this[i])
}
return result
}
slice可以用来将伪数组转化为真正的数组.
Array.prototype.slice.call(arrayLike)
ES6以后可以使用
array = Array.from(array.like)
伪数组和真数组的区别在于是否拥有Array.prototype.由于没有Array.prototype,伪数组没有push, pop等常用操作.
3 forEach && map
forEach是对数组里的每一项依次执行一个函数
let arr = [1,2,3]
arr.forEach((cur, index, array) => {
console.log(cur + 1)
}) // [2 , 3, 4]
forEach方法无法中断执行,如果希望中间可以中断,那么可以使用for.
forEach的简单实现:
function forEach(fn) {
for (let i = 0; i < this.length; i++) {
if (i in this) {
fn.call(undefined, this[i], i, this)
}
}
}
map的实现和forEach相似, 多了一个返回值
function map(fn) {
let result = []
for (let i = 0; i < this.length; i++) {
if (i in this) {
result[i] = fn.call(undefined, this[i], i, this)
}
}
return result
}
加入使用map, 然后return null,则 map和forEach的作用完全一样.
4.filter
filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。
它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组。
let arr = [1,2,3,4]
arr.filter( el => el >= 2) // [2,3,4]
filter的简单实现:
function filter (fn) {
let result = []
let temp
for(let i=0; i < this.length;i++) {
if (temp = fn.call(undefined,this[i],i,this)) {
result.push(this[i])
}
}
return result
}
5.reduce
reduce方法依次处理数组的每个成员,最终累计为一个值.可以用来代替一些map和filter的作用.
let arr = [1,2,3,4]
arr.reduce((cur, next)=> cur+next, 0) // 10
arr.reduce((cur,next)=>{ if(cur%2==0) { cur.push(next =) } return result } , [])
arr= array.reduce( (result, v)=> { result.push(v + 1) return result }, [ ] )
reduce的简单实现:
function reduce(fn, init) {
let result = init
for(let i=0; i < this.length; i++) {
if (i in this) {
result = fn.call(undefined, result, this[i], i , this)
}
}
}