重写数组方法
深拷贝
js
// ES5
function deepClone(origin, target) {
if (typeof origin !== 'object' || origin === null) return origin;
var tar = target || {};
var toStr = Object.prototype.toString;
var arrayType = '[object Array]';
for (var k in origin) {
if (origin.hasOwnProperty(k)) {
if (typeof origin[k] === 'object' && origin[k] !== null) {
tar[k] = toStr.call(origin[k]) === arrayType ? [] : {};
deepClone(origin[k], tar[k]);
} else {
tar[k] = origin[k];
}
}
}
return tar;
}
具体实现
js
Array.prototype.myForEach = function (callback) {
var _arr = this;
var _len = _arr.length;
var _arg2 = arguments[1] || window;
for (var i = 0; i < _len; i++) {
callback.apply(_arg2, [_arr[i], i, _arr]);
}
};
js
Array.prototype.myMap = function (callback) {
var _arr = this;
var _len = _arr.length;
var _arg2 = arguments[1] || window;
var _newArr = [];
var _item;
var _res;
for (var i = 0; i < _len; i++) {
_item = deepClone(_arr[i]);
_res = callback.apply(_arg2, [_item, i, _arr]);
_res && _newArr.push(_res);
}
return _newArr;
};
js
Array.prototype.myFilter = function (callback) {
var _arr = this;
var _len = _arr.length;
var _arg2 = arguments[1] || window;
var _newArr = [];
var _item;
for (var i = 0; i < _len; i++) {
// 此处是提前做判断,若不是'object'就不调用深拷贝函数,不做也可以,深拷贝函数中已做判断
_item =
typeof _arr[i] === 'object' && _arr[i] !== null
? deepClone(_arr[i])
: _arr[i];
callback.apply(_arg2, [_item, i, _arr]) ? _newArr.push(_item) : '';
}
return _newArr;
};
js
Array.prototype.myEvery = function (callback) {
var _arr = this;
var _len = _arr.length;
var _arg2 = arguments[1] || window;
for (var i = 0; i < _len; i++) {
if (!callback.apply(_arg2, [_arr[i], i, _arr])) {
return false;
}
}
return true;
};
js
Array.prototype.mySome = function (callback) {
var _arr = this;
var _len = _arr.length;
var _arg2 = arguments[1] || window;
for (var i = 0; i < _len; i++) {
if (callback.apply(_arg2, [_arr[i], i, _arr])) {
return true;
}
}
return false;
};
js
Array.prototype.myReduce = function (callback, initialValue) {
var _arr = this;
var _len = _arr.length;
var _arg3 = arguments[2] || window;
var _item;
for (var i = 0; i < _len; i++) {
_item = deepClone(_arr[i]);
initialValue = callback.apply(_arg3, [initialValue, _item, i, _arr]);
}
return initialValue;
};
js
Array.prototype.myReduceRight = function (callback, initialValue) {
var _arr = this;
var _len = _arr.length;
var _arg3 = arguments[2] || window;
var _item;
for (var i = _len - 1; i >= 0; i--) {
_item = deepClone(_arr[i]);
initialValue = callback.apply(_arg3, [initialValue, _item, i, _arr]);
}
return initialValue;
};