- o→ 最好js和html用独立的引号风格,如
- o→ 始终用var之类来声明变量,不用未声明变量
- o→ let和const取代var, 全局常量使用const
- o→ 特意将变量声明放在函数体顶部, 而不是使用变量之外, 来反映真实的作用域声明提前
- o→ 多用解构
- const [first, second] = arr # 数组取元素
- function f({a, b}) {} # 对象解构给函数赋值
- function f() {return {a, b}}, const {a, b} = f() # 函数返回值解构
- var arr2 = […arr] # 扩展运算符拷贝数组
- o→ 单行定义对象不逗号结尾(以后不扩展), 多行时逗号结尾(以后可能会扩展), 尽量用简洁的写法
-
{a: 1, b}
{
[getKey('a')],
}
- o→ Array.from转换类数组到数组
- o→ 匿名函数 (() ⇒ {})(), 同时绑定了this为当前作用域
- o→ 不使用arguments, 使用rest运算符
- o→ 函数使用默认值 function f (opts = {}) {}
- o→ 用Map取代Object, 因为Map内建遍历机制, key可为对象。只能要数据转换时用Object
- o→ 总是用class取代需要的prototype操作, 因为class写法更简洁。extends也更简单, 不会有破坏instanceof运算的危险
- o→ 模块使用es6的机制, 模块只能一个输出时用export default, 多输出时用export, 不要export 和export default混合使用
- o→ 运算符
- var t = o && o.a || ” # 有o时取o.a, 无o时取”, 因为&&的优先级比||高
- var ifExist = !!o.a # 转换成布尔类型, 当然o.a = 0 什么的值时, 会判断失误,所以用来判断对象
- o→ 判断类型
-
typeof a === "string" # 数组等其他Object类型通通是Object
a instanceof Array # 判断Object类型的具体类型
a.constructor == Array # 判断构造函数
Object.prototype.toString.call(o) === '[object Array]' # 用toString判断
- o→ 柯里化
-
function currying (fn, n) {
return function (m) {
return fn.call(this, m, n);
}
}
function tailFactorial(n, total) { # 尾递归调用优化
if(n === 1) return total;
return tailFactorial (n - 1, n * total);
}
const factorial = currying(tailFactorial, 1);
factorial(5)
- o→ 尾递归
-
function factorial (n, total = 1) {
if(n === 1) return total;
return factorial(n - 1, n * total);
}