join()
join() 方法将一个数组(或一个类数组对象)的所有元素连接成一个字符串并返回这个字符串。如果数组只有一个项目,那么将返回该项目而不使用分隔符。
用js实现join功能:
array=[1,2,3]
array.join(',');//1,2,3
Array.prototype.join=function(char){
let result=this[0] || '';
let length=this.length;
for(let i=1;i<length;i++){
result += char + this[i];
}
return result
}
slice()
slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变。
用js实现slice功能:
array.slice(beginIndex,endIndex);
Array.prototype.slice=function(begin,end){
let result=[];
let begin=begin || 0;
end=end || this.length;
for(let i=begin;i<end;i++){
result.push(this[i]);
}
return result
}
sort()
sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的 由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。
用js实现sort功能:
array.sort((a,b)=>a-b);
Array.prototype.sort=function(fn){
fn=fn || (a,b)=>a-b;
let roundCount =this.length-1;//比较的轮数
for(let i=0;i<roundCount;i++){
let minIndex=this[i];
for(let k=i+1;k<this.length;k++){
if(fn.call(null,this[k],this[i])<0){
[this[i],this[k]]=[this[k],this[i]]
}
}
}
}
fn.call(null,this[k],this[i])决定了第k项和第i项的前后(大小)关系。
forEach()
forEach() 方法对数组的每个元素执行一次提供的函数。
用js实现forEach功能:
array.forEach((item,index,array)=>{console.log(item,index,array)});
Array.prototype.forEach=function(fn){
for(let i=0;i<this.length;i++){
if(i in this){
fn.call(undefined,this[i],i,this)
}
}
}
forEach和for的区别主要有两个:
1.forEach没法break
2.forEach用到了函数,所以每次迭代都会有一个新的函数作用域;而for循环只有一个作用域。
map()
map() 方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。
map和forEach的区别就是map把返回的值放在了一个数组里返回,有返回值,forEach是没有返回值的。
用js实现map功能:
array=[1,2,3]
array.map((item,index,array)=>{return item+1});//[2,3,4]
Array.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
}
filter()
filter() 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
用js实现filter功能:
array=[1,2,3,4,5,6]
array.filter((value)=>{return value%2===0});//[2,4,6]
Array.prototype.filter=function(fn){
let result=[]
let temp
for(let i=0;i<this.length;i++){
if(i in this){
if(temp=fn.call(undefined,this[i],i,this)){
result.push(temp)
}
}
}
return result
}
fn.call()返回真值就push到返回值,没返回真值就不push
reduce()
reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
用js实现reduce功能:
array=[1,2,3,4,5,6]
array.reduce((result,item,index,array)=>{return result+item},0);//21
Array.prototype.reduce=function(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)
}
}
return result
}