六个漂亮的 ES6 技巧
六个漂亮的 ES6 技巧
转载
原文:2ality
译文:众成翻译
链接:http://www.zcfy.cc/article/346
在这篇文章里,我将演示 6 种 ES6 新特性的使用技巧。在每个段落的末尾,我会指出它们在我的书 Exploring ES6(http://exploringjs.com/es6/) 中的出处(你可以在线免费阅读这本书)。
通过参数默认值强制要求传参
ES6 指定默认参数在它们被实际使用的时候才会被执行,这个特性让我们可以强制要求传参:
/**
* Called if a parameter is missing and
* the default value is evaluated.
*/
function mandatory() {
throw new Error("Missing parameter");
}
function foo(mustBeProvided = mandatory()) {
return mustBeProvided;
}
函数调用 mandatory() 只有在参数 mustBeProvided 缺失的时候才会被执行。
在控制台测试:
> foo()
Error: Missing parameter
> foo(123)
123
更多内容:
段落: “Required parameters” 。
通过 for-of 循环来遍历数组元素和索引
方法 forEach() 允许你遍历一个数组的元素和索引:
var arr = ["a", "b", "c"];
arr.forEach(function (elem, index) {
console.log("index = "+index+", elem = "+elem);
});
// Output:
// index = 0, elem = a
// index = 1, elem = b
// index = 2, elem = c
ES6 的 for-of 循环支持 ES6 迭代(通过 iterables 和 iterators)和解构。如果你通过数组的新方法 enteries() 再结合解构,可以达到上面 forEach 同样的效果:
const arr = ["a", "b", "c"];
for (const [index, elem] of arr.entries()) {
console.log(`index = ${index}, elem = ${elem}`);
}
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 字符表示)。例如:
for (const ch of "xuD83DuDE80y") {
console.log(ch.length);
}
// Output:
// 1
// 2
// 1
这让你能够很方便地得到一个字符串中实际的字数:
> [..."xuD83DuDE80y"].length
3
展开操作符 (...) 将它的操作对象展开并插入数组。
更多内容:
章节: “Unicode in ES6”
段落: “The spread operator (...)”
通过变量解构交换两个变量的值
如果你将一对变量放入一个数组,然后将数组解构赋值相同的变量(顺序不同),你就可以不依赖中间变量交换两个变量的值:
[a, b] = [b, a];
可以想象,JavaScript 引擎在未来将会针对这个模式进行特别优化,去掉构造数组的开销。
更多内容:
章节: “Destructuring”
通过模板字面量(template literals)进行简单的模板解析
ES6 的模板字面量与文字模板相比,更接近于字符串字面量。但是,如果你将它们通过函数返回,你可以使用他们来做简单的模板渲染:
const tmpl = addrs => `
${addrs.map(addr => `
${addr.first}${addr.last}
`).join("")}
`;
tmpl 函数将数组 addrs 用 map(通过箭头函数) join 拼成字符串。tmpl() 可以批量插入数据到表格中:
const data = [
{ first: "", last: "Bond" },
{ first: "Lars", last: "" },
];
console.log(tmpl(data));
// Output:
// //
//
// Bond
//
// Lars
//
//
//
更多内容:
博客文章: “Handling whitespace in ES6 template literals”
段落: “Text templating via untagged template literals”
章节: “Arrow functions”
通过子类工厂实现简单的合成器
当 ES6 类继承另一个类,被继承的类可以是通过任意表达式创建的动态类:
// Function id() simply returns its parameter
const id = x => x;
class Foo extends id(Object) {}
这个特性可以允许你实现一种合成器模式,用一个函数来将一个类 C 映射到一个新的继承了C的类。例如,下面的两个函数 Storage 和 Validation 是合成器:
const Storage = Sup => class extends Sup {
save(database) { ··· }
};
const Validation = Sup => class extends Sup {
validate(schema) { ··· }
};
你可以使用它们去组合生成一个如下的 Employee 类:
class Person { ··· }
class Employee extends Storage(Validation(Person)) { ··· }
更多信息:
段落: “Simple mixins”
进一步阅读
下面的两个章节提供了很好地概括了 ECMAScript 6 的特性:
An overview of what’s new in ES6
First steps with ECMAScript 6 [features that are easy to adopt]
六个漂亮的 ES6 技巧的更多相关文章
- webpack学习(六)—webpack+react+es6(第3篇)
接上篇 : webpack学习(六)—webpack+react+es6(第2篇) 上篇其实是有问题的,问题在取服务器数据这块.this.props 表示那些一旦定义,就不再改变的特性,而 this. ...
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║Vue基础:ES6初体验 & 模块化编程
缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很 ...
- css学习の第六弹—样式设置小技巧
一.css样式设置小技巧>>1.行内元素水平居中是通过给父元素设置 text-align:center 来实现的.html代码:<body> <div class=&qu ...
- 期货大赛项目|六,iCheck漂亮的复选框
废话不多说,直接上图 对,还是上篇文章的图,这次我们不研究datatables,而是看这个复选框,比平常的复选框漂亮太多 看看我是如何实现的吧 插件叫iCheck 用法也简单 引入js和css $(& ...
- Linux(六)shell操作实用技巧
一.shell操作日期时间 linux 系统为我们提供了一个命令 date,专门用来显示或者设置系统日期时间的. 语法格式为: date [OPTION]... [+FORMAT] ...
- es6技巧写法
为class绑定多个值 普通写法 :class="{a: true, b: true}" 其他 :class="['btn', 'btn2', {a: true, b: ...
- webpack学习(六)—webpack+react+es6(第2篇)
接上篇 webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...
- vue学习(十六) 自定义私有过滤器 ES6字符串新方法 填充字符串
<div id="app"> <p>{{data | formatStr('yyyy-MM-dd')}}</p></div> //s ...
- (六)pandas 日常使用技巧
pandas数据处理 1.删除重复元素 import numpy as np import pandas as pd from pandas import Series,DataFrame df = ...
随机推荐
- 【IOS】将一组包含中文的数据按照#ABC...Z✿分组
上一篇文章[IOS]模仿windowsphone列表索引控件YFMetroListBox里面 我们一步步的实现了WindowsPhone风格的索引. 但是有没有发现,如果你要实现按照字母排序,你还得自 ...
- qt5中文代码编码编译问题
qt中文代码用vs2010编译问题解决 总结说就是qt5默认UTF8不支持微软默认的ANSI(GB2312/GBK).解决办法是把中文字符串全部用 QString::fromLocal8Bit() 封 ...
- CJCMS系列---说说项目中的缓存实现(1)
缓存者,临时文件交换区也.主要就是方便查找,提高查找效率(效率在于读内存速度比读硬盘快). 大多数的项目的缓存都是通过设定过期时间来做的,可是我对于这样的替换策略不以为然,而且会导致混乱. 有人说: ...
- MySQL自动化运维之用mysqldump和mysqlbinlog实现某一数据库的每周全备和每天差异备份,并添加到执行计划【热备】
案例: 线上有一数据库,需要每周全备一次,每天差备一次[安全起见还是差备吧,不要增备,不要吝啬磁盘哦,而且差备恢复还很快] 1.每周对数据库hellodb做完全备份 crontab任务计划: * * ...
- STM32F10xxx 之 System tick Timer(SYSTICK Timer)
背景 研究STM32F10xxx定时器的时候,无意间看到了System tick Timer,于是比较深入的了解下,在此做个记录. 正文 System tick Timer是Cotex-M内核的24位 ...
- 搭建Apache Web服务器
1.下载Apache服务器的安装包 地址:http://httpd.apache.org/download.cgi 从http://archive.apache.org/dist/httpd/bina ...
- 玩QQ游戏,见到好几个图像是美女的QQ,就不始玩
玩QQ游戏,见到好几个图像是美女的QQ,光占坑就是不开始玩 加了一个,发现是传播不良网站的QQ 聊天还是自动的 估计是利用webqq写的程序,也就那几句话来回重复,让你去注册网站什么 可以加这个Q去体 ...
- JS利用取余实现toggle多函数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- Linux下的压缩和解压缩命令——zip/unzip
zip命令 zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名 的压缩文件. 选项: -A 调整可执行的自动解压缩文件. -b<工作目录> ...