重构push方法
Array.prototype.myPush = function () {
// arguments 所有的实参集合--->遍历
for (var i = 0; i < arguments.length; i++) {
this[this.length] = arguments[i]; // 将每个实参写入this数组中
}
// 返回值写入后的数组长度
return this.length;
}
重构数组map方法
Array.prototype.myMap = function (cb) {
var newArr = []; // 作为myMap的返回值数组
// 遍历数组
for (var i = 0; i < this.length; i++) {
// 将回调函数的结果作为 newArr数组的数据写入
var r = cb(this[i], i, this)
newArr.push(r);
}
return newArr;
}
重构数组的 filter 方法
- filter方法传入的函数需要执行 数组的长度 次
- filter返回值:
+ 是一个新数组
+ 新数组中的数据 是传入的函数执行后返回值为true 对应的数组元素
Array.prototype.myFilter = function (cb) {
var newArr = [];
// 遍历this数组
for (var i = 0; i < this.length; i++) {
var flag = cb(this[i], i, this);
// 判断flag是否为true 将this[i]数组元素添加到newArr
if (flag) newArr.push(this[i]);
}
return newArr;
}
重构every方法
- 返回值是 布尔值
- 根据传入函数执行的返回值来决定
+ 如果某一个元素执行传入的函数返回值是false则最终结果是false
+ 每一个元素执行传入函数返回值都是true则最终结果是true
Array.prototype.myEvery = function (cb) {
for (let i = 0; i < this.length; i++) {
var r = cb(this[i], i, this);
if (!r) return false;
}
// 循环调用 回调函数 完毕 代码还没执行结束
return true
}
重构some方法
- 返回值是 布尔值
- 根据传入函数执行的返回值来决定
+ 如果某一个元素执行传入的函数返回值是true则最终结果是true
+ 每一个元素执行传入函数返回值都是false则最终结果是false
Array.prototype.mySome = function (cb) {
for (let i = 0; i < this.length; i++) {
var r = cb(this[i], i, this);
if (r) return true;
}
// 循环调用 回调函数 完毕 代码还没执行结束
return false
}
重构reduce方法
Array.prototype.myReduce = function (cb, init) {
var i = init === undefined ? 1 : 0; // init是否传递初始值决定了循环变量的初始值
var prev = init === undefined?this[0]:init; // prev第一次值取决以init是否传参
for (; i < this.length; i++) {
prev = cb(prev,this[i],i,this);
// 回调函数的结果 需要赋值给prev并返回
}
return prev;
}