codingmeup
codingmeup
### 遍历tree 觉得用这几个字母表示递归遍历的三种方法不错: D:访问根结点,L:遍历根结点的左子树,R:遍历根结点的右子树。 **哪个遍历 就哪个在中间** - 先序遍历:DLR - 中序遍历:LDR - 后序遍历:LRD 这3种遍历都属于递归遍历,或者说深度优先遍历(Depth-First Search,DFS),因为它总是优先往深处访问。 ```js Document //创建二叉树 function Node(data,left,right){ this.data = data; this.left = left; this.right = right; } Node.prototype.show...
### 前端数据结构 #### VDOM Fiber Hooks ```js { type: 'div', props: { name: 'lucifer' }, children: [{ type: 'span', props: {}, children: [] }] } ``` - 逻辑上 VDOM 就是用来抽象...
 基础技巧:分治、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、深度优先遍历,广度优先遍历,二叉搜索树等 图论:最短路径、最小生成树 动态规划:背包问题、最长子序列 数据结构,主要有如下几种: 数组与链表:单 / 双向链表 栈与队列 哈希表 堆:最大堆 / 最小堆 树与图:最近公共祖先、并查集 字符串:前缀树(字典树) / 后缀树 ### 高级数据结构 #### 优先队列 Priority Queue  本质:二叉堆结构, 用一个数组结构来做 完全二叉树 区别:...
既然要实现继承,那么首先我们得有一个父类,代码如下: ```js // 定义一个动物类 function Animal (name) { // 属性 this.name = name || 'Animal'; // 实例方法 this.sleep = function(){ console.log(this.name + '正在睡觉!'); } } // 原型方法 Animal.prototype.eat = function(food)...
### 总结 继承对于JS来说就是父类拥有的方法和属性、静态方法等,子类也要拥有。子类中可以利用原型链查找,也可以在子类调用父类,或者从父类拷贝一份到子类等方案。 继承方法可以有很多,重点在于必须理解并熟悉这些对象、原型以及构造器的工作方式,剩下的就简单了。寄生组合式继承是开发者使用比较多的。 回顾寄生组合式继承。主要就是三点: - 子类构造函数的__proto__指向父类构造器,继承父类的静态方法 - 子类构造函数的prototype的__proto__指向父类构造器的prototype,继承父类的方法。 - 子类构造器里调用父类构造器,继承父类的属性。
#### 优势 1. 更好的管理状态。因为它的宗旨是无状态,或者说更少的状态。而平常DOM的开发中,因为DOM的视觉呈现依托于状态变化,所以不可避免的产生了非常多的状态,而且不同组件可能还相互依赖。以FP来编程,能最大化的减少这些未知、优化代码、减少出错情况。测试很简单,同时函数式编程强调使用纯函数,没有副作用,因此也很少出现奇怪的 Bug。 2. 更简单的复用。极端的FP代码应该是每一行代码都是一个函数,当然我们不需要这么极端。我们尽量的把过程逻辑以更纯的函数来实现,固定输入->固定输出,没有其他外部变量影响,并且无副作用。这样代码复用时,完全不需要考虑它的内部实现和外部影响。 3. 更优雅的组合。往大的说,网页是由各个组件组成的。往小的说,一个函数也可能是由多个小函数组成的。参考上面第二点,更强的复用性,带来更强大的组合性。 4. 隐性好处。减少代码量,提高维护性。 5. 易于"并发编程":函数式编程没有副作用,所以函数式编程不需要考虑“死锁”(Deadlock),所以根本不存在“锁”线程的问题。 #### 劣势 1. JavaScript不能算是严格意义上的函数式语言,很多函数式编程的特性并没有。比如上文说的数组的惰性链求值。为了实现它就得上工具库,或者自己封装实现,提高了代码编写成本。 2. 跟过程式相比,**性能和资源占用**绝对是一个短板,它并没有提高性能。有些地方,如果强制用FP去写,由于没有中间变量,还可能会降低性能。因为它往往会对一个方法进行过度包装,从而产生上下文切换的性能开销。同时,在 JS 这种非函数式语言中,函数式的方式必然会比直接写语句指令慢(引擎会针对很多指令做特别优化)。就拿原生方法 map 来说,它就要比纯循环语句实现迭代慢 8 倍。资源占用:在 JS 中为了实现对象状态的不可变,往往会创建新的对象,因此,它对垃圾回收(Garbage Collection)所产生的压力远远超过其他编程方式。这在某些场合会产生十分严重的问题。 3. 代码不易读。这个因人而异,因码而已。特别熟悉FP的人可能会觉得这段代码一目了然。而不熟悉的人,遇到写的晦涩的代码,看着一堆堆lambda演算跟匿名函数...
https://juejin.im/post/5d70e25de51d453c11684cc4
### 加工站——柯里化 #### 柯里化的意思是将一个多元函数,转换成一个依次调用的单元函数。 f(a,b,c) → f(a)(b)(c) > 为什么这个单元函数很重要?还记得我们之前说过的,函数的返回值,有且只有一个嘛? 如果我们想顺利的组装流水线,那我就必须保证我每个加工站的输出刚好能流向下个工作站的输入。因此,在流水线上的加工站必须都是单元函数。 ### 流水线——函数组合 #### 函数组合的目的是将多个函数组合成一个函数 ```js const compose = (f, g) => x => f(g(x)) const f = x => x...
### 举例 ```js const data = [ { name: 'Peter', sex: 'M', age: 18, grade: 99 }, …… ] ``` 实现以下几个常用功能: 1. 获取所有年龄小于 18 岁的对象,并返回他们的名称和年龄。 2. 查找所有男性用户。 3. 更新一个指定名称用户的成绩(不影响原数组)。 4....
#### ES 2020 1. 对象Optional Chaining 可选链式调用 ```js console.log(flower.species?.lily) // 输出 undefined flowers?.[1] plantFlowers?.() ``` 2. ?? 由两个问号组成:?? 的合并操作符就可以检查变量 number 是否是一个数字,而不用写额外的代码了 ```js let myNumber = number ?? 7 let myNumber...