六个漂亮的 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 技巧的更多相关文章

  1. webpack学习(六)—webpack+react+es6(第3篇)

    接上篇 : webpack学习(六)—webpack+react+es6(第2篇) 上篇其实是有问题的,问题在取服务器数据这块.this.props 表示那些一旦定义,就不再改变的特性,而 this. ...

  2. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║Vue基础:ES6初体验 & 模块化编程

    缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很 ...

  3. css学习の第六弹—样式设置小技巧

    一.css样式设置小技巧>>1.行内元素水平居中是通过给父元素设置 text-align:center 来实现的.html代码:<body> <div class=&qu ...

  4. 期货大赛项目|六,iCheck漂亮的复选框

    废话不多说,直接上图 对,还是上篇文章的图,这次我们不研究datatables,而是看这个复选框,比平常的复选框漂亮太多 看看我是如何实现的吧 插件叫iCheck 用法也简单 引入js和css $(& ...

  5. Linux(六)shell操作实用技巧

    一.shell操作日期时间 linux 系统为我们提供了一个命令 date,专门用来显示或者设置系统日期时间的.      语法格式为:      date [OPTION]... [+FORMAT] ...

  6. es6技巧写法

    为class绑定多个值 普通写法 :class="{a: true, b: true}" 其他 :class="['btn', 'btn2', {a: true, b: ...

  7. webpack学习(六)—webpack+react+es6(第2篇)

    接上篇        webpack学习(五)—webpack+react+es6(第1篇) 本文做个简单的图片加文字的页面.其中,配置文件跟上篇一致.项目结构: index.html <!DO ...

  8. vue学习(十六) 自定义私有过滤器 ES6字符串新方法 填充字符串

    <div id="app"> <p>{{data | formatStr('yyyy-MM-dd')}}</p></div> //s ...

  9. (六)pandas 日常使用技巧

    pandas数据处理 1.删除重复元素 import numpy as np import pandas as pd from pandas import Series,DataFrame df = ...

随机推荐

  1. [实战]MVC5+EF6+MySql企业网盘实战(29)——更新日志

    摘要 NetDisk更新日志,及项目使用说明. 开发工具 Vs2013+mysql+ef6+mvc5 bug 1.在加载列表的时候,默认加载的所有,修改为,过滤逻辑删除的文件. 2.加载音乐,文档等分 ...

  2. 20155217-杨笛-c与java

    命是弱者的借口,运是强者的谦词 你有什么技能比大多数人(超过90%以上)更好? 针对这个技能的获取你有什么成功的经验? 与老师博客中的学习经验有什么共同之处? 其实我经常会去想自己有什么拿得出手的优点 ...

  3. uboot 第三天学习

    make jCPU_NUM 以CPU_NUM数量同时进行编译CPU_NUM = 当前PC的处理器数量*处理器的核心数 从上电开始1.系统上电,执行固化在IROM中的代码,目的初始化基本的系统功能,已经 ...

  4. MySQL的简单使用

    MySQL 参数     参数 描述 备注 -D,--database=.name 打开指定数据库 mysql –uroot –procky –Dhisdb 或者mysql –uroot –prock ...

  5. kafka(logstash) + elasticsearch 构建日志分析处理系统

    第一版:logstash + es 第二版:kafka 替换 logstash的方案

  6. virtualBox上虚拟机和主机互联{}

    VirtualBox实现内外网络互访问的配置   环境: 宿主机操作系统            Windows XP sp3 虚拟机软件                       VirtualBo ...

  7. Linux下实现秒级的crontab定时任务

    crontab的格式如下 * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 ...

  8. 测试基础:Bug管理那些事_20160910

    1.bug由来 虫子爬进主机引起继电器短路,导致机器故障.真正的缺陷是:主机散热孔少装了块金属丝,这样才能防止虫子爬到主机. 2.什么是bug? bug是缺陷的一种表现形式,而一个缺陷是可以引发多种b ...

  9. 怎么把Maven项目转为动态Web项目?

  10. Web APP 之rem的使用

    移动端web app的开发,之前开发直接使用px像素做单位,这样子做对于传统的PC端开发来说,个人比较习惯,但是对于移动端在来,有说逞强.最明显是切图效果与设计师想达到的效果有些差距,比如<he ...