手写js常用方法
条评论不管用什么工具写,反正得用到手,所以这个标题似乎并没有什么不妥。
下面进入正题。
Promise是个用于异步执行的方法类,他的显著特点是支持链式调用,避免了之前异步执行嵌套回调那种写法的弊病,毕竟代码是给人看的,回调地狱的写法看起来就费劲。
1 |
|
关于then链式调用的详细实现后面再说吧
实现一个 curry function
1 |
|
实现一个compose函数
1 |
|
模拟redux
的combineReducers
网上combineReducers
的用处说是将多个reducer
进行合并。我开始看到这里一想reducer
不就是那些switch case
之类的判断吗。那他所谓的合并莫不是叠加case
?我当时就想那不干脆用字符拼接嘛,然后用eval执行?哈哈哈哈~我这直观的脑路啊!
combineReducers(state)
里面的参数实际就是你全局的state
的数据格式,他可以让你一个key对应一个reduce方法。他们所谓的好吧实际就是遍历这个state对象的所有的key,并且执行对应的reduce方法,以改变其value。那这就很简单了嘛!
1 | function combineReducers(reduceObj={}){ |
实现数组扁平化
1 |
|
js的instance of
方法主要是判断一个对象是不是某个指定构造函数的实例,其判断的来源于该对象的__proto__
属性是不是指定构造函数的原型,并且这种判断是可以顺着原型链往上追溯的,所以方法的实现核心就是判断构造函数的prototype
跟实例的__proto__
是不是一致。
1 | function instanceOf(instance, constructor){ |
reduce方法实现
1 |
|
debounce方法实现
1 | function debounce(fn, time){ |
throttle方法实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function throttle(fn, time){
var freeze = false;
return function(){
if(freeze) return;
var that = this;
var args = arguments;
freeze = true;
setTimeout(function(){
fn.apply(that, args);
freeze = false;
}, time)
}
}
冒泡排序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25var list = [1,2,3,4,5,6,4,3,2,1];
function bubbleSort(list){
var len = list;
for(var i=0; i<list.length; i++){
for(var j=i; j<list.length; j++){
var l = list[i];
var r = list[j];
var temp = l;
if(r<l){
list[i] = r;
list[j] = temp;
}
}
}
return list;
}
bubbleSort(list)
快速排序1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17function quickSort(arr){
if(arr.length <= 1){ return arr; };
var middleIndex = Math.floor(arr.length/2);
var item = arr.splice(middleIndex, 1)[0];
var leftArr = [];
var rightArr = [];
for(var i=0; i<arr.length; i++){
var obj = arr[i];
if(obj<item){
leftArr.push(obj);
}else{
rightArr.push(obj);
}
}
return quickSort(leftArr).concat(item, quickSort(rightArr));
}
实现一个请求可以控制最大并行请求数量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
46class GlobalRequest {
constructor(maxConcurrency) {
this.max = maxConcurrency;
}
requestList = [];
runNextTask() {
for (let i = 0; i < this.requestList.length; i++) {
const request = this.requestList[i];
if (request.wait) {
//找到下一个待执行任务
request.wait = false;
request.fn();
break;
}
}
}
get(url) {
return new Promise((resolve, reject) => {
const p = {
wait: true,
fn: () => {
window.fetch(url).then((data) => {
const i = this.requestList.indexOf(p);
//找到当前执行完的任务,将其从队列删除;
this.requestList.splice(i, 1);
//再执行下一个待执行任务
this.runNextTask();
resolve(data);
});
}
};
this.requestList.push(p);
if (this.requestList.length <= this.max) {
p.wait = false;
p.fn();
}
});
}
}
const r = new GlobalRequest(2);
实现一个 Events 模块,可以实现自定义事件的订阅、触发、移除功能。
1 | class EEvent { |
- 本文链接:https://zhayes.github.io/2018/12/11/create/
- 版权声明:转载请附原文地址
分享