call
主要让绑定对象新增属性指向原函数,然后利用隐式绑定。记得删除辅助属性。
Function.prototype.call = function() {
let [targetObj, ...args] = [...arguments];
targetObj.func = this;
let res = targetObj.func(...args);
delete targetObj.func;
return res;
}
bind
Function.prototype.bind = function () {
let [targetObj, ...args] = [...arguments];
let that = this
let bindedFunction = () => this.apply(targetObj, args)
return bindedFunction
}
Promise.all
Promise.all = fuction(promisesArr) {
return new Promise((resolve, reject) => {
if (!promisesArr.length) return resolve([])
let resArr = [], alreadyFullfill = 0
for (let [i, p] of promisesArr.entries()) {
Promise.resolve(p).then(res => {
resArr[i] = res
alreadyFullfill++
if (alreadyFullfill === promisesArr.length) return resolve(resArr)
}, err => {
return reject(err)
})
}
})
}
Promise.race
Promise.race = function(promisesArr) {
return new Promise((resolve, reject) => {
for (let [i, prom] of promisesArr.entries()) {
Promise.resolve(prom).then(res => {
return resolve(res)
}, err => {
return reject(err)
})
}
})
}
catch、resolve、reject
curry
function curry(func) {
return function curriedFunc(...args) {
if (args.length < func.length) {
return funtion() {
return curriedFunc(...args.concat(Array.from(arguments)))
}
}
return func(...args)
}
}
deepCopy 考虑循环引用
function deepCopy(obj, map = new WeakMap()) {
if (obj === null || typeOf obj !== 'object') {
return obj
}
if (map.has(obj)) {
return map.get(obj)
}
let target = new obj.constructor()
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
target[key] = deepCopy(obj[key], map)
}
}
map.set(obj, target)
return target
}
debounce、throttle
function debounce(func, ms = 300) {
let time = 0
return function() {
if (Date.now() - time > ms) {
time = Date.now()
return func(...Array.from(arguments))
}
time = Date.now()
}
}
function throttle(func, ms = 300) {
let time = 0
return function() {
if (Date.now() - time > ms) {
time = Date.now()
return func(...Array.from(arguments))
}
}
}