JavaScript中的一些方法重构

1.重构shift方法

shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
没有参数,修改原数组。

思路:想要删除第一个元素,我们只需要把第二个以后的元素往前移一位,然后再让数组长度减一即可。

Array.prototype.myShift = function () {
    // 先获取第一项数组元素 
    var first = this[0];
    for (var i = 0; i < this.length; i++) {
        // 将后面得所有数组元素往前移动一位
        this[i] = this[i + 1];
    }
    // 数组长度减1
    this.length--;
    // 返回第一项
    return first
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myShift();
console.log(res, arr);

结果如图

2.重构unshift方法

unshift() 方法可向数组的开头添加一个或更多元素,并返回新的数组长度。
有参数,修改原数组。

思路:要添加几个元素,我们就让原数组元素往后移几位,然后将要添加的元素添加到前面。

Array.prototype.myUnshift = function () {
    // console.log(arguments.length);
    // 新数组长度 sum = 原数组长度 + 实参得个数(arguments得长度auguments.length)
    var sum = this.length + arguments.length;
    for (i = sum; i > 0; i--) {
        // 将原数组得中数组元素向后移动argument.length位
        if (i > arguments.length) {
            // 1 2 3 4 5 [4]
            // xxx xxx 1 2 3 4 5 [6]
            // this[6] = this[4]
            this[i - 1] = this[i - 1 - arguments.length]
        } else {
            this[i - 1] = arguments[i - 1]
        }
    }
    // 返回新数组得长度
    return sum
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myUnshift('tom', 'larry');
console.log(res, arr);//['tom','larry','terry',1,2,3,4,5]

结果如图

3.重构forEach方法

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

思路:这里我们只需要循环遍历数组,将参数传给回调函数执行即可,不需要做其他操作。

Array.prototype.myForEach = function (callback) {
    // callback ---> function(item,index,arr){console.log(item,index,arr)}
    for (var i = 0; i < this.length; i++) {
        callback(this[i], i, this)
    }
}
var arr = [1, 2, 3, 4, 5];
arr.myForEach(function (item, index, arr) {
    console.log(item, index, arr)
});

结果如图

4.重构every方法

every() 方法使用指定函数检测数组中的所有元素:
1、如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
2、如果所有元素都满足条件,则返回 true。

every() 方法有两个有意义的参数,第一个是回调函数(它又有三个参数,分别表示:数组元素的值、索引值、数组本身);第二个用来指定回调函数的this指向,这里我们可以使用call、apply或者bind方法来绑定this指向。

思路:我们使用循环遍历数组,将参数传给回调函数,又因为回调函数返回的是布尔值,因此我们可以使用它作为判断条件。

Array.prototype.myEvery = function (callback) {
    for (var i = 0; i < this.length; i++) {
        // 找不符合条件表达的数组元素直接返回false 其他返回true
        if (!callback(this[i])) {
            return false
        }
    }
    return true
}
var arr = [1, 2, 3, 4, 5];
var res = arr.myEvery(function (item) {
    console.log('every');
    return item > 0
});
console.log(res);

结果如图

5.重构some方法

some() 方法会依次执行数组的每个元素:
1、 如果有一个元素满足条件,则表达式返回 true , 剩余的元素不会再执行检测。
2、如果没有满足条件的元素,则返回 false。

some()方法和every()类似,不同在于 some()方法只要有一个满足条件就返回true,而every()方法只要有一个不满足就返回false。

Array.prototype.mySome = function(callback){
	for(var i=0;i<this.length;i++){
		// 只要有一个数组元素符合条件表达式 直接返回true
		if(callback(this[i],i,this)){
			return true
		}
	}
	return false
}
var arr = [1,2,3,4,5];
var res = arr.mySome(function(item,index,arr){
	console.log('some')
	return item>5
});
console.log(res);

结果如图

 6.重构pop方法

pop() 方法用于删除数组的最后一个元素,并返回删除的元素。
没有参数,会修改原数组,数组为空时返回 undefined

思路:
我们想要删除数组元素,就要获取到该数组,那么我们如何获取该数组呢?
由于数组调用了pop()方法,因此 this 指向该数组。

获取到该数组之后,我们需要做的就是:
当数组为空时,返回 undefined;
当数组不为空时,先获取最后一个元素的值作为返回值,再删除。

Array.prototype.myPop=function(){
	if(this.length>0){
		// 返回值 返回删除的数组最后一项 
		var last = this[this.length-1];
		// 数组长度减1 
		this.length--;
		return last;
	}else{
		// 数组为空 
		return undefined
	}
}
var arr = [1,2,3,4,5];
var res = arr.myPop();
console.log(res,arr);

 结果如图

7.重构push方法

push() 方法可向数组的末尾添加一个或多个元素,并返回新的数组长度。
有参数,会修改原数组。

思路:我们要如何获取需要添加的元素,即如何获取push()的参数?
函数中有一个类数组对象 arguments 可以获取到函数的实参。

获取到了需要添加的元素之后,我们只需要把它们遍历添加到数组尾部即可。

Array.prototype.myPush = function () {
    // [1 2 3,] this[this.length]
    // 遍历调用myPush实际参数  把实际参数放在数组的末尾下一项
    for (i = 0; i < arguments.length; i++) {
        this[this.length] = arguments[i]
    }
    return this.length
}
var arr = ['hello', '10', 25];
var res = arr.myPush('tom', 'terry');
console.log(res, arr);

function fc(a, b) {
    // console.log(a,b)
    // 函数内部属性 arguments 专门保存实际参数的类数组对象
    console.log(arguments[3])
}
fc(1, 2, 3, 4, 5)

结果如图

8.重构map方法

Array.prototype.concat, myMap = function (callback) {
    var newArr = [];
    for (var i = 0; i < this.length; i++) {
        newArr.push(callback(this[i], i, this))
    }
    return newArr
}
var arr = [1, 2, 3, 4, 5];
var res = arr.map(function (item, index, arr) {
    return item + 5
});
console.log(res);

 结果如图

9.重构filter方法

Array.prototype.myFilter = function (callback) {
    var newArr = [];
    for (var i = 0; i < this.length; i++) {
        if (callback(this[i])) {
            newArr.push(this[i])
        }
    }
    return newArr;
}

var arr = [1, 2, 3, 4, 5];
var res = arr.myFilter(function (item) {
    return item > 3
})
console.log(res);

结果如图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值