防抖节流
function debounce(func,delay,immediate){
var timeout;
return function(){
var _this=this;
var e=arguments;
if(timeout) clearTimeout(timeout);
if(immediate){
const callNow = !timeout;
timeout = setTimeout(()=>{
timeout = null;
},delay)
if(callNow) func.apply(_this,e);
}else{
timeout=setTimeout(function(){
func.apply(_this,e);
},delay);
}
}
}
var throttle = (func, delay) => {
let timeFlag=null, last=null;
return function(){
let _args = arguments;
let _this = this;
let now = +new Date();
if(last&&last + delay > now){
clearTimeout(timeFlag);
timeFlag = setTimeout(() => {
last = now;
func.apply(_this,_args);
},delay)
}else{
last = now;
func.apply(_this,_args);
}
}
}
promiseAll & promiseRace
function promiseAll(promises) {
var res = [],
count = 0;
return new Promise((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
Promise.resolve(promises[i]).then(
(v) => {
count++;
res[i] = v;
if (count == promises.length) {
resolve(res);
}
},
(r) => {
reject(r);
}
);
}
});
}
function promiseRace(promises) {
return new Promise((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
promises[i].then(
(v) => {
resolve(v);
},
(r) => {
reject(r);
}
);
}
});
}
发布订阅
class EventEmitter {
constructor() {
this.list = {}
}
on(name, fn) {
if (this.list[name]) {
this.list[name].push(fn)
} else {
this.list[name] = [fn]
}
}
off(name, fn) {
const tasks = this.list[name]
if (tasks) {
const index = tasks.findIndex((f) => f === fn || f.callback === fn)
if (index >= 0) {
tasks.splice(index, 1)
}
}
}
emit(name, once = false) {
if (this.list[name]) {
const tasks = this.list[name].slice();
for (let fn of tasks) {
fn();
}
if (once) {
delete this.list[name]
}
}
}
}
深拷贝
function deepClone(obj, hash = new WeakMap()) {
if (obj === null) return obj;
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if (typeof obj !== "object") return obj;
if (hash.get(obj)) return hash.get(obj);
let cloneObj = Array.isArray(obj) ? [] : {};
hash.set(obj, cloneObj);
for (let key in obj) {
console.log(key)
if (obj.hasOwnProperty(key)) {
cloneObj[key] = deepClone(obj[key], hash);
}
}
return cloneObj;
}
柯里化 和下面那个不一样
function sum(x,y,z) {
return x + y + z
}
function hyCurrying(fn) {
function curried(...args) {
if(args.length >= fn.length){
return fn.apply(this, args)
}
else{
return function(...args2) {
return curried.apply(this, args.concat(args2))
}
}
}
return curried
}
var curryAdd = hyCurry(sum)
curryAdd(10,20,30)
curryAdd(10,20)(30)
curryAdd(10)(20)(30)
add(1, 2)(3, 4, 5)(6)
function curry(...args) {
function curried (...restArgs) {
return curry(...args,...restArgs)
}
curried.toString = function() {
let fn = args[0]
let param = args.slice(1)
return fn(...param)
}
return curried;
}
let dynamicAdd = (...args) => args.reduce((prev, curr) => prev + curr, 0)
var add = curry(dynamicAdd);
console.log(Number(add(1, 2)(3, 4,5)(6)))
数组转树 不止一个父节点的情况
let list = [
{ id: 56, parent_id: 62 },
{ id: 81, parent_id: 80 },
{ id: 74, parent_id: null },
{ id: 76, parent_id: 80 },
......
];
function fn(list) {
let obj = {};
let res = [];
for (let item of list) {
obj[item.id] = item;
}
for (let item of list) {
if (obj[item.parent_id]) {
if(!obj[item.parent_id].children){
obj[item.parent_id].children=[]
}
obj[item.parent_id].children.push(item)
} else {
res.push(item);
}
}
return res;
}
数组拍平和去重
去重
拍平
instanceof
function new_instance_of(leftVaule, rightVaule) {
let rightProto = rightVaule.prototype;
leftVaule = leftVaule.__proto__;
while (true) {
if (leftVaule === null) {
return false;
}
if (leftVaule === rightProto) {
return true;
}
leftVaule = leftVaule.__proto__
}
}
deepEqual
function isEqual(x, y) {
if (x === y) {
return true;
} else if (
typeof x === "object" &&
x !== null &&
typeof y === "object" &&
y !== null
) {
const keysX = Object.keys(x);
const keysY = Object.keys(y);
if (keysX.length !== keysY.length) {
return false;
}
for (const key of keysX) {
if (!isEqual(x[key], y[key])) {
return false;
}
}
return true;
} else {
return false;
}
}
bind apply call
Function.prototype._call = function(thisArg,...args){
let func = this
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
let fn = Symbol()
thisArg[fn] = this
let result = thisArg[fn](...args)
delete thisArg[fn]
return result
}
Function.prototype._apply = function(thisArg,argArray){
let fn = this
thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
argArray = argArray || []
thisArg.fn = fn
let result = thisArg.fn(...argArray)
delete thisArg.fn
return result
}
Function.prototype._bind = function(thisArg,...args){
let fn = this
return function(){
return fn._call(thisArg, ...args)
}
}
setTimeout实现setInterval
function setInterval(fn, time){
var interval = function(){
setTimeout(interval, time);
fn();
}
setTimeout(interval,time);
}
实现new
function myNew(){
let obj = {};
let con = [].shift.call(arguments);
obj.__proto__ = con.prototype;
let result = con.apply(obj, arguments)
return result instanceof Object ? result:obj;
}
function Car(name,price){
this.name = name
}
Car.prototype.run = function() {
console.log(this.price);
};
var test_create = myNew(Car, 'a', 100000);
console.log(test_create)
let obj = new Car( 'a', 100000)
console.log(obj)
实现并发
const limitMessages = (urls ,limit) => {
let count = 0;
let lens = urls.length;
const pooling = (url) => {
sendMessage(url).then((v) => {
console.log(`request ${v} finished`);
if(++count < lens){
pooling(urls[count]);
}
})
}
for(let i = 0 ; i < limit ; i++){
pooling(urls[count++]);
}
}
const sendMessage = (url) => {
return new Promise((resolve) => {
console.log(`start request ${url}`);
setTimeout(() => {
resolve(url);
},Math.random()*10000);
})
}
let urls = Array.from(new Array(100).keys())
limitMessages(urls,5)
let solve = (urls,limits) =>{
let count = 0
for(let i = 0; i<limits; i++){
pooling();
}
let pooling = ()=>{
sendMessage(urls[count++]).then(r => {
if(count < urls.length){
poopling();
}
})
}
}
hardman
class _HardMan {
constructor(name) {
this.tasks = [];
setTimeout(async () => {
for (let task of this.tasks) {
await task()
}
})
this.tasks.push(() =>
new Promise(resolve => {
console.log(`I am ${name}`)
resolve()
})
)
}
wait(sec) {
return new Promise(resolve => {
setTimeout(() => {
console.log(`Start learning after ${sec} seconds`)
resolve()
}, sec * 1000);
})
}
rest(sec) {
this.tasks.push(() => this.wait(sec))
return this
}
restFirst(sec) {
this.tasks.unshift(() => this.wait(sec))
return this
}
learn(params) {
this.tasks.push(() =>
new Promise(resolve => {
console.log(`Learning ${params}`)
resolve()
})
)
return this
}
}
const HardMan = function (name) {
return new _HardMan(name)
}
HardMan("jack").restFirst(3).learn("Chinese").learn("Englsih").rest(2).learn("Japanese")