宁静致远。
说明
- 知识在不断迭代,除了学习资料,那就是学习他人,来丰富自己。
- 以下全是别人的源码,会标明出处,非常感谢原作者,非常感谢开源。
优雅
- mitt:源码,微型库解读之200byte的EventEmitter - Mitt
- axios: 源码
- 零散:12 useful hacks
mitt
// source code
all = all || Object.create(null);
- 短路运算符:详情MDN
- Object.create(null):生成的对象是一个原型为空的对象。节约内存且避免冲突,因为没有原型,且普通对象原型上的属性和方法也相应没有了。
// source code
(all[type] || (all[type] = [])).push(handler);
// my code - bad
if (all[type]) {
all[type].push(handler)
} else {
all[type] = [handler]
}
- 简洁的队列赋值:短路逻辑判断 + 初始化 + 更新数组,简直不要太优雅。
// source code
all[type].splice(all[type].indexOf(handler) >>> 0, 1);
- 按位操作符:1 >>> 0 = 1, -1 >>> 0 = 4294967295, 详情MDN
- 补充:按位操作符'~',可以结合.indexOf()使用,因为对任一数值 x 进行按位非操作的结果为 -(x + 1),即:~-1 = 0
// source code
(all[type] || []).slice().map((handler) => { handler(evt); });
(all['*'] || []).slice().map((handler) => { handler(type, evt); });
- Array.slice():slice不传参数的时候,相当于浅复制一个数组,详情MDN
axios
零散
// source code
!!(0) // false
!!(null) // false
!!('') // false
!!(undefined) // false
!!(NaN) // false
!!(2) // true
- !!: 强制转换成 boolean 类型,相当于 !(!val)。如果 val = 0/null/""/undefined/NaN 时,!!(val) = false,如果 val 是其他值,!!(val) = true
- !: 取反运算,返回的也是一个 boolean 类型。如果 val = 0/null/""/undefined/NaN 时,!(val) = false,如果 val 是其他值,!(val) = true
// source code
+'123456' // 123456, Number
+new Date() // 1527684413484, 相当于 new Date().getTime()
- +: +val 将字符串数字转为数字。如果 val 是非字符串数字,则 +val = NaN
好记性不如烂笔头。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。