首先实现join
var arr = [1, 2, 3, 4, 5, 6, 7, 8];
Array.prototype.myJoin = function (str) {
var result = this[0] || '';
var length = this.length;
for (let i = 1; i < length; i++) {
result += str + this[i];
}
return result;
}
实现slice
Array.prototype.mySlice = function (start, end) {
var start = start || 0;
var end = end || this.length;
var newArr = [];
for (let i = start; i < end; i++) {
newArr.push(this[i]);
}
return newArr
}
以前经常使用Array.prototype.slice.call()将伪数组转换成数组,原理就是遍历伪数组将元素放到新的数组中返回出来,es6的新方法Array.from也是同样的功能。
实现foreach和map
Array.prototype.myForEach = function (fn) {
for (let i = 0; i < this.length; i++) {
if (i in this) {
fn.call(null, this[i], i, this);
}
}
}
Array.prototype.myMap = function (fn) {
var result = [];
var temp = null;
for (let i = 0; i < this.length; i++) {
if (i in this) {
result[i] = fn.call(null, this[i], i, this);
}
}
return result
}
foreach和map的实现方式基本一样区别只是有没有返回值。
实现filter
Array.prototype.myFilter = function (fn) {
var result = [];
var temp = null;
for (let i = 0; i < array.length; i++) {
if (i in this) {
if (temp = fn.call(null, this[i], i, this)) {
result.push(temp);
}
}
}
return result;
}
实现reduce
Array.prototype.myReduce = function (fn, init) {
var result = init;
for (let i = 0; i < this.length; i++) {
if (i in this) {
result = fn.call(null, this[i], i, this);
}
}
return result
}
不清楚js源码中reduce是如何实现的,以前看大漠老师的博客讲到reduce的效率比for循环要高,想必内部不是使用了for循环。
网友评论