本篇博客仅以个人学习记录使用
原文链接: https://www.h5jun.com/post/six-nifty-es6-tricks.html
通过参数默认值强制要求传参
ES6 指定默认参数在它们被实际使用的时候才会被执行,这个特性让我们可以强制要求传参:
1 | /** |
函数调用 mandatory() 只有在参数 mustBeProvided 缺失的时候才会被执行。
在控制台测试:
1 | > foo() |
更多内容:
段落: “Required parameters” 。
通过 for-of 循环来遍历数组元素和索引
方法 forEach() 允许你遍历一个数组的元素和索引:
1 | var arr = ["a", "b", "c"]; |
ES6 的 for-of 循环支持 ES6 迭代(通过 iterables 和 iterators)和解构。如果你通过数组的新方法 enteries() 再结合解构,可以达到上面 forEach 同样的效果:
1 | const arr = ["a", "b", "c"]; |
arr.enteries() 通过索引-元素配对返回一个可迭代对象。然后通过解构数组 [index, elem] 直接得到每一对元素和索引。console.log() 的参数是 ES6 中的模板字面量特性,这个特性带给字符串解析模板变量的能力。
更多内容:
章节: “Destructuring” 。
章节: “Iterables and iterators”。
段落: “Iterating with a destructuring pattern” 。
章节: “Template literals” 。
遍历 Unicode 表示的字符串
一些 Unicode 编码的字由两个 JavaScript 字符组成,例如,emoji 表情:
字符串实现了 ES6 迭代,如果你通过迭代来访问字符串,你可以获得编码过的单个字(每个字用 1 或 2 个 JavaScript 字符表示)。例如
1 | for (const ch of "x\uD83D\uDE80y") { |
这让你能够很方便地得到一个字符串中实际的字数:
1 | > [..."x\uD83D\uDE80y"].length |
展开操作符 (…) 将它的操作对象展开并插入数组。
更多内容:
章节: “Unicode in ES6” 。
段落: “The spread operator (…)” 。
通过变量解构交换两个变量的值
如果你将一对变量放入一个数组,然后将数组解构赋值相同的变量(顺序不同),你就可以不依赖中间变量交换两个变量的值:
1 | [a, b] = [b, a]; |
可以想象,JavaScript 引擎在未来将会针对这个模式进行特别优化,去掉构造数组的开销。
更多内容:
章节: “Destructuring”
通过模板字面量(template literals)进行简单的模板解析
ES6 的模板字面量与文字模板相比,更接近于字符串字面量。但是,如果你将它们通过函数返回,你可以使用他们来做简单的模板渲染:
1 | const tmpl = addrs => ` |
tmpl 函数将数组 addrs 用 map(通过箭头函数) join 拼成字符串。tmpl() 可以批量插入数据到表格中:
1 | const data = [ |
更多内容:
博客文章: “Handling whitespace in ES6 template literals”
段落: “Text templating via untagged template literals”
章节: “Arrow functions”
通过子类工厂实现简单的合成器
当 ES6 类继承另一个类,被继承的类可以是通过任意表达式创建的动态类:
1 | // Function id() simply returns its parameter |
这个特性可以允许你实现一种合成器模式,用一个函数来将一个类 C 映射到一个新的继承了C的类。例如,下面的两个函数 Storage 和 Validation 是合成器:
1 | const Storage = Sup => class extends Sup { |
你可以使用它们去组合生成一个如下的 Employee 类:
1 | class Person { ··· } |
更多内容:
段落: “Simple mixins”
进一步阅读
下面的两个章节提供了很好地概括了 ECMAScript 6 的特性:
“An overview of what’s new in ES6”