1. join
1 | Array.prototype.join = function(char){ |
2. slice
1 | Array.prototype.slice = function(begin, end){ |
因此可以用 slice 来将伪数组,转化成数组1
2
3array = Array.prototye.slice.call(arrayLike)
或者
array = [].slice.call(arrayLike)
但是没必要,因为ES6有更好的方法1
array = Array.from(arrayLike)
P.S. 伪数组与真数组的区别就是:伪数组的原型链中没有 Array.prototype,而真数组的原型链中有 Array.prototype。因此伪数组没有 pop、join 等属性。
3. sort
1 | Array.prototype.sort = function(fn){ |
4. forEach
1 | Array.prototype.forEach = function(fn){ |
forEach 和 for 的区别主要有两个:
- 1.forEach 没法 break
- 2.forEach 用到了函数,所以每次迭代都会有一个新的函数作用域;而 for 循环只有一个作用域(著名前端面试题就是考察了这个)
5. map
1
2
3
4
5
6
7
8
9Array.prototype.map = function(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和forEach的区别就是map有返回值而forEach没有
6. filter
1 | Array.prototype.filter = function(fn){ |
7. reduce
1 | Array.prototype.reduce = function(fn, init){ |
- reduce 实现 map
1
2
3
4
5
6array2 = array.map( (v) => v+1 )
可以写成
array2 = array.reduce( (result, v)=> {
result.push(v + 1)
return result
}, [ ] )
- reduce 实现 map
- reduce 实现 filter
1
2
3
4
5
6array2 = array.filter( (v) => v % 2 === 0 )
可以写成
array2 = array.reduce( (result, v)=> {
if(v % 2 === 0){ result.push(v) }
return result
}, [])
- reduce 实现 filter