扁平结构和树形结构相互转化
背景
假设我们有一堆评论的数据需要存储,通常来说数据库中是上面的扁平形式,而我们显示出来应该是树形结构。
于是就有了这里的内容,扁平结构和树形结构相互转换。
扁平转树状
如下,内容都在注释里:
1234567891011121314151617181920212223242526272829303132333435const flatComments = [ { id: 1, co ...
实现观察者模式
源码
来自半年后的说明:我把代码转放到 gists 里了,当时代码风格受 Python 影响较大,这里就不再更改了,毕竟大家本地都有自己的格式化工具。
点击这里前往Github查看本文源码。
实现
我们要定义一个observer函数,它会把我们传入的对象复制一份再进行代理,并且返回的代理对象上还有一个observe方法,用来添加一个观察者:
12345678910111213141516171 ...
原生JS实现哈希路由
源码
使用Codepen在线体验和查看源码。
页面代码
在我们用前端框架的时候,经常用到路由技术,就是在地址栏确实发生了变化但是页面没有刷新,那么本文就介绍通过更改哈希的方式实现这样一种路由,下面是页面代码:
123456789<h1>Hash Router</h1><div> <a href="#/">Home</a ...
从实例中学习reduce方法
需求
如下:
123['Red', 'White', 'Yellow']// 转为{ Red: 'Red', White: 'White', Yellow: 'Yellow' }
接下我来用几个方法去实现这个功能。
传统方法
自然是没有for循环解决不了的问题 ...
JS函数无限柯里化
不用箭头函数的实现
网上看到很多用箭头函数的版本,在看不懂的时候非常的眼花。
所以在这里我选择先用纯粹的function配合arguments分析完原理,再过渡到轻量级的箭头函数。下面给出最原始的实现:
123456789function curry(f, ...savedArgs) { return function() { const totalArgs ...
WebSocket简单应用
简介
如果想要实现实时与服务器连接,一个简单的方法如下:
123setInterval(() => { ajax()}, 5000)
通过这种方式可以达到不断刷新的目的,但是它存在着诸多弊端:
如果没有新的内容的话,反复请求同一内容浪费流量。
如果有新的内容,用户无法第一时间得到,需要等待下一次定时器被调用。
所有出现了WebSocket这种技术,它可以实现服务 ...
用Proxy写几个Demo
背景
本文是根据阮一峰大大的文章写几个小Demo,这里的代码都是我自己看了一遍需求敲出来的,不存在直接复制黏贴的情况,请放心。
数组负数索引
众多语言都支持数组的索引为负数,就像这段Python代码一样:
123arr = [1, 2, 3]print(arr[-1])## 3
我们可以通过Proxy让JS也支持这一操作:
1234567891011121314151617181920212223 ...
学习基础Proxy
背景
本文是我先学习MDN之后写下的,但是实现功能的代码都是我自己根据学习所得知识写出来的,不会照搬。
Proxy 是 ES6 为我们新增的对象,和它的名字一样,它起到一个代理作用,可以拦截对对象的操作,比如获取数据,设置属性等。
Proxy
下面是从MDN摘过来的,但是释义是我自己写的:
1const p = new Proxy(target, handler)
target
被Prox ...
在JS中愉快地使用枚举
背景
在JS中并没有原生枚举的实现,可以通过下面几种方法来模拟类似的操作。
直接使用字符串
上代码:
12345678910111213function isWeekend(day) { return day === 'Sat' || day === 'Sun'}console.log(isWeekend('Sun ...
关于JS执行顺序
背景
众所周知,JS是单线程语言,但它支持异步操作,其核心机制就是JS引擎的事件循环。
先上一段代码:
12345678910111213141516console.log(1)setTimeout(() => { console.log(2)})new Promise(resolve => { console.log(3) resolv ...