Day1

计数器

闭包

创建 Hello World 函数

闭包

Day2

计数器 II

闭包

转换数组中的每个元素

数组转换

Day3

过滤数组中的元素

数组转换

数组归约运算

数组转换

Day4

复合函数

输入输出

只允许一次函数调用

输入输出

Day5-可以多回顾一下

记忆函数

输入输出

柯里化

输入输出

↑这个需要会员,我没做,不过看了一些柯里化函数的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 一个接收三个参数的普通函数
function add(a, b, c) {
return a + b + c
}

// 柯里化
function curry(func) {
return function curried(...args) {
if (func.length <= args.length) {
// 当参数个数满足要求时,即可带着参数返回函数执行
return func(...args)
} else {
// 参数不够时,返回带着部分参数的函数,继续接收参数
return function(...nextArgs) {
return curried(...args, ...nextArgs)
}
}
}
}
const curried = curry(add)
console.log(curried(1)(2)(3)) // => 6

Day6-promise需要多回顾

睡眠函数

Promise (异步)

有时间限制的 Promise 对象

Promise (异步)

Day7-promise、延时器

Promise 对象池

Promise (异步)

又是一个会员专享。。。

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
// 创建一个存放Promise对象的结构,使得可以复用这些Promise对象,减少了Promise创建/销毁开销

// 创建对象池
const promisePool = []

// 创建一个Promise
function asyncOperation() {
return new Promise(res => {
setTimeout(() => {
return res('花1秒 创建了一个新的Promise')
}, 1000)
})
}

// 对象池拿出操作-如果已存在,从对象池拿出;如果不存在,新建一个
function getPromiseFromPool() {
if (promisePool.length > 0) {
return promisePool.pop()
} else {
return asyncOperation()
}
}

// 对象池添加操作
function recyclePromise(promise) {
promisePool.push(promise)
}

// 使用对象池操作
function performAsyncOperation() {
const promise = getPromiseFromPool() // 拿出
promise.then(res => {
console.log(res) // 后续
recyclePromise(promise) // 重新放入
})
}

// 使用
performAsyncOperation()
performAsyncOperation()

有时间限制的缓存

Time

这个真的很有意思,直接把延时器作为对象中元素存入到了map中。这样一来,就可以轻松处理过期删除问题了!

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
var TimeLimitedCache = function() {
this.map = new Map()
};

TimeLimitedCache.prototype.set = function(key, value, duration) {
let existed = this.map.has(key)
if (existed) {
let temp = this.map.get(key)
clearTimeout(temp.timer)
}
// 过期自动删除
let timer = setTimeout(() => {
this.map.delete(key)
}, duration)
// 添加/覆盖存储中的键值对
this.map.set(key, {
value: value,
timer: timer
})
return existed
};

TimeLimitedCache.prototype.get = function(key) {
let existed = this.map.has(key)
if (existed) {
return this.map.get(key).value
} else {
return -1
}
};


TimeLimitedCache.prototype.count = function() {
return this.map.size
};

/**
* Your TimeLimitedCache object will be instantiated and called as such:
* var obj = new TimeLimitedCache()
* obj.set(1, 42, 1000); // false
* obj.get(1) // 42
* obj.count() // 1
*/

Day8

函数防抖

Time

使用延时器实现一个简单的防抖效果。

节流

Time

又是个会员题。。。我去自己找点节流题做好了。。。找不到,自己实现一个吧!

1
2
3
4
5
6
7
8
9
10
11
12
function throttled(fn, delay) {
let timer = null
let func = this
return function(...args) {
if (!timer) {
timer = setTimeout(() => {
fn.apply(func, args)
timer = null
}, delay)
}
}
}

Day9

完全相等的 JSON 字符串

将对象转换为 JSON 字符串

这俩全是会员题。。。。

JSON / 递归 / 相关实现常见业务函数方法

Day10

将对象数组转换为矩阵

两个对象之间的差异

这俩也是。。。

自学自码

Day11

分块数组

扁平化嵌套数组

诶嘿最喜欢的凹双百了,时间和内存均100%

Day12-原型

数组原型对象的最后一个元素

分组

对象引用(原型链)

Day13-原型

检查是否是类的对象实例

使用自定义上下文调用函数

对象引用(原型链)

Day14-有趣

生成斐波那契数列

嵌套数组生成器

Generators(生成器)