对象深拷贝
- 初始版
function deepClone(origin,target) {
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
}
2.优化版本*(解决对象中循环引用深拷贝死循环问题)
function deepClone2(origin, hashMap = new WeakMap()) {
if (origin == undefined || typeof origin !== 'object') {
return origin
}
if (origin instanceof Date) {
return new Date(origin)
}
if (origin instanceof RegExp) {
return new RegExp(origin)
}
const hashKey = hashMap.get(origin)
if (hashKey) {
return hashKey
}
const target = new origin.constructor()
hashMap.set(origin, target)
for (let k in origin) {
if (origin.hasOwnProperty(k)) {
target[k] = deepClone(origin[k], hashMap)
}
}
return target
}
重写ForEarch
Array.prototype.myForEach = function (cb) {
var _arr = this
var _len = _arr.length
var _arg2 = arguments[1] || window
for (let i = 0; i < _len; i++) {
cb.apply(_arg2, [_arr[i], i, _arr])
}
}
重写map
Array.prototype.myMap = function (cb) {
var _arr = this
var _len = _arr.length
var _arg2 = arguments[1] || window
var result = []
for (let i = 0; i < _len; i++) {
var _item = deepClone2(arr2[i])
var _res = cb.apply(_arg2, [_item, i, _arr])
_res && result.push(_res)
}
return result
}
重写filter
Array.prototype.myFilter = function (cb) {
var _arr =this
var _len = _arr.length
var _arg2 = arguments[1]||window
var result = []
for (var i = 0; i < _len; i++) {
var _item = deepClone2(arr2[i])
var _res = cb.apply(_arg2, [_item, i, _arr])
_res && result.push(_item)
}
return result
}
重写reduce
Array.prototype.myReduce = function (cb, initialValue) {
var _arr = this
var _len = _arr.length
var _arg2 = arguments[2] || window
var _item
for (let i = 0; i < _len; i++) {
_item = deepClone(_arr[i])
initialValue = cb.apply(_arg2, [initialValue, _item, i, _arr])
}
return initialValue
}
重写reduceRight
Array.prototype.myReduceRight = function (cb, initialValue) {
var _arr = this
var _len = _arr.length
var _arg2 = arguments[2] || window
var _item
for (let i = _len; i > 0; i--) {
_item = deepClone(_arr[i])
initialValue = cb.apply(_arg2, [initialValue, _item, i, _arr])
}
return initialValue
}
重写every
Array.prototype.myEvery = function (cb) {
var _arr =this
var _len = _arr.length
var _arg2 = arguments[1]||window
var result = true
for (var i = 0; i < _len; i++) {
if(!cb.apply(_arg2, [_arr[i], i, _arr])){
result = false
break
}
}
return result
}
重写some
Array.prototype.mySome = function (cb) {
var _arr =this
var _len = _arr.length
var _arg2 = arguments[1]||window
var result = false
for (var i = 0; i < _len; i++) {
if(cb.apply(_arg2, [_arr[i], i, _arr])){
result = true
break
}
}
return result
}