数组去重方法
对象拷贝方法
数组交集、并集、差集
数组扁平
防抖和节流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const myDeboundce = (fn, time) => { let timer; return (...args) => { if (timer) { clearTimeout(timer); } timer = setTimeout(() => { fn(...args); timer = null; }, time); } }
const myThrottle = (fn, time) => { let timer; return (...args) => { if (timer) return; timer = setTimeout(() => { fn(...args); timer = null; }, time); } }
|
实现Promise
实现Promise.all
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| const myPromiseAll = (arr: Promise<any>[]) => { let count = 0; let promiseRes: any = []; return new Promise((res, rej) => { arr.forEach((p, index) => { Promise.resolve(p) .then((resolve) => { ++count; promiseRes[index] = resolve; if (count === arr.length) { res(promiseRes); } }) .catch((reject) => { rej(reject); }); }); }); };
|
实现Promise.allSettled
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| const myPromiseAllSettled = (arr: Promise<any>[]) => { let count = 0; let promiseRes: any = []; return new Promise((resolve, reject) => { arr.forEach((item, index) => { Promise.resolve(item) .then( (value) => { promiseRes[index] = { status: "fulfilled", value }; }, (reason) => { promiseRes[index] = { status: "rejected", reason }; }, ) .finally(() => { ++count; if (count === arr.length) { resolve(promiseRes); } }); }); }); };
|
实现Promise.race
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| ```
#### 实现一个new 1. 内存中创建一个新对象 2. 新建对象的 _ _proto_ _指向构造函数的prototype 3. 调用构造函数,函数的this指向新创建的对象 4. 执行构造函数内部的代码(给新对象添加属性) 5. **如果构造函数返回非空对象,则返回该对象,否则,返回新创建的对象**
```javascript function Person(age, name) { this.age = age; this.name = name; } Person.prototype.sayHello = function() { console.log(this.name); }
function myNew(fn, ...args) { const obj = Object.create(fn.prototype) const rel = fn.apply(obj,args)
return rel instanceof Object ? rel : obj } const p1 = myNew(Person, 19, 'hyz');
|
实现一个Object.create
Object.create(proto)创建一个空对象,proto为空对象的”proto“
1 2 3 4 5 6 7 8 9 10 11
| export function create(obj) { if (obj === null) { return Object.setPrototypeOf({}, null); } if (!(obj instanceof Object)) { throw new TypeError(); } return Object.setPrototypeOf({}, obj); }
|
虾皮笔试题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| function Person() {
} let person1 = new Person(); Person.prototype = { name: 'ee', sayName: () => {
} }
console.log('person1 instanceof Person: ', person1 instanceof Person)
console.log('person1 instanceof Object: ', person1 instanceof Object)
console.log('person1.constructor == Person: ', person1.constructor == Person)
console.log('person1.constructor == Object: ', person1.constructor == Object)
|
实现消息订阅
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class EventCenter {
constructor(handlers=new Map()) { this.handlers = handlers; }
addEventListener(type, newHandler) { let hanlder = this.handlers.has(type); if (hanlder) { this.handlers.set(type, [...this.handlers.get(type), newHandler]) } else { this.handlers.set(type, [newHandler]); } }
dispatchEvent(type, params=[]) { const handler = this.handlers.get(type); handler && handler.forEach((callback) => { callback(...params); }) }
removeEventListener(type, delHandler) { if (!this.handlers.has(type)) { return new Errow("Unable to delete") } if (delHanlder) { const oldHandlers = this.handlers.get(type); const ind = oldHandlers.indexOf(delHandler); if (ind === -1) { return new Errow("Unable to delete") } oldHandlers.splice(ind, 1); } else { this.handlers.delete(type); } } }
|
实现一个JSONP
前端部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| function jsonp(url, options) { const { timeout } = options; return new Promise((resolve, reject) => { let funcName = `jsonp${Date.now()}`; let time = null, scriptNode; window[funcName] = function (data) { if (timeout) clearTimeout(time); resolve(data); delete window[funcName]; document.body.removeChild(scriptNode); } scriptNode = document.createElement('script'); scriptNode.src = `${url}?callback=${funcName}`; document.body.appendChild(scriptNode); time = setTimeout(() => { reject('network err, timeout') }, timeout) scriptNode.onerror = function (err) { reject(err); } }) } jsonp('http://localhost:9090/api', { callBack: 'res1', timeout: 3000 }) .then(res => { console.log('jsonp->', res); }) .catch(err => { console.log("network err!") })
|
后端部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| const http = require('http'); const url = require('url'); http.createServer((req, res) => { if(req.url.includes('/api')) { let myurl = url.parse(req.url); let params = new URLSearchParams(myurl.query) let posts = ['js', 'php']; let mathodName = params.get('callback'); res.end(`${mathodName}(${JSON.stringify(posts)})`) } }) .listen(9090, () => { console.log(9090); })
|
实现一个 once 函数,记忆返回结果只执行一次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| const f = (x) => x; const once = (fn) => { let flag = false; let res; return (...args) => { if (flag) { return res; } flag = true; res = fn(...args); return res; } }
const onceF = once(f);
console.log(onceF(3));
console.log(onceF(4));
|