js 数组一些方法实现原理
2021-03-01 22:25
标签:ring targe nts || 属性 lse this val 而不是 js 数组一些方法实现原理 标签:ring targe nts || 属性 lse this val 而不是 原文地址:https://www.cnblogs.com/ll-11/p/14426851.html // let obj = {
// a: 12,
// arr: [{
// b: 12
// }, {
// c: 13
// }]
// }
function deepClone(origin, target) {
let tar = target || {};
let str = Object.prototype.toString;
let arrType = ‘[object Array]‘;
for (let key in origin) {
//判断属性是否在自己本身而不是在原型链上面
if (origin.hasOwnProperty(key)) {
if (typeof origin[key] === ‘object‘ && origin[key] != null) {
tar[key] = str.call(origin[key])=== arrType ? [] : {};
deepClone(origin[key], tar[key])
} else {
tar[key] = origin[key]
}
}
}
return tar
}
// const newObj = deepClone(obj, {})
// newObj.a = 14
// console.log(newObj);
// console.log(obj);
/**
*
*
* 实现foreach重写
*
*
*/
let arr = [
{
name:‘zs‘,
age:10
},
{
name:‘ls‘,
age:12,
},
{
name:‘wu‘,
age:19
}
]
// arr.forEach(function(item,index,ar){
// console.log(item,index,ar);
// })
// Array.prototype.myForeach = function(cb){
// //谁调用指向谁
// var _arr = this;
// var _len = _arr.length;
// var _arg2 = arguments[1] || window;
// for (let i = 0; i
// cb.apply(_arg2,[_arr[i],i,_arr])
// }
// }
// arr.myForeach(function(item,index,ar){
// console.log(this);
// console.log(item,index,ar);
// })
/**
*
* 重写map方法
*
*/
// arr.map(function (item,index,arr) {
// console.log(item,index,arr);
// })
// Array.prototype.myMap = function (cb) {
// let _arr = this;
// let _len = _arr.length;
// let _arg2 = arguments[1] || window;
// let newArr = [];
// let _item;
// for (let i = 0; i
// _item = deepClone(_arr[i])
// newArr.push(cb.apply(_arg2,[_item,i,_arr]))
// }
// return newArr
// }
// arr.myMap(function (item,index,arr) {
// console.log(item,index,arr);
// })
// Array.prototype.myFilter = function (cb) {
// //保存数组
// let _this = this;
// let _len = _this.length;
// let _arg2 = arguments[1] || window;
// let _newArr = [];
// let _item;
// for (let i = 0; i
// _item = deepClone(_this[i])
// cb.apply(_arg2,[_item,i,_this])?_newArr.push(_item) : ""
// }
// return _newArr;
// }
// let newarr = arr.filter(function (item,index) {
// return false
// })
// let myfilr = arr.myFilter(function (item,index) {
// return true
// })
// console.log(newarr);
// console.log(myfilr);
/**
*
* every 重写
*
*
*
*/
// arr.every(function (item,index,array) {
// console.log(item,index,array);
// })
// Array.prototype.myeve = function (cb) {
// let _arr = this;
// let _len = _arr.length;
// let _arg2 = arguments[1] || window;
// let _flag = true;
// for (let i = 0; i
// let fl = cb(_arg2,[_arr[i],i,_arr])
// if (!fl) {
// _flag = false;
// break;
// }
// }
// return _flag;
// }
// let rel = arr.myeve(function (item,index,array) {
// return item.age
// })
// console.log(rel);
/**
* 重写some
*
*/
// let a = arr.some(function (item,index) {
// console.log(item,index);
// return item.age == 18
// })
// console.log(a);
// Array.prototype.mysome = function (cb) {
// let _arr = this;
// let _len = _arr.length;
// let _arg2 = arguments[2] || window;
// let _flag = false;
// for (let i = 0; i
// let fl = cb.apply(_arg2,[_arr[i],i,_arr])
// if (fl) {
// _flag = true;
// break;
// }
// }
// return _flag
// }
/**
* 重写reduce
*
*
*/
let redarr = []
let newArr = arr.reduce(function (prev,item,index,array) {
//也可以使用reduce做筛选
item.age>10 && prev.push(item)
return prev
},redarr)
console.log(newArr);
Array.prototype.myReduce = function (cb,initvalue) {
let _arr = this;
let _len = _arr.length;
let _argu3 = arguments[2] || window;
let _item;
for (let i = 0; i ) {
_item = deepClone(_arr[i])
initvalue = cb.apply(_argu3,[initvalue,_item,i,_arr])
}
return initvalue
}