编辑推荐

  √2015年6月新发布的标准,被全球IT企业及前端开发者广泛拥护、支持。

  √由知名博主、前端新知布道者阮一峰老师执笔。

  √《ES 6 标准入门(第2版)》紧跟业界实践,透彻解读新增特性、语法,代码示例简洁易用。

  √把握趋势,覆盖ES7,指导JavaScript开发者提升功力,了解语言发展动向。

内容简介

  ES6(又名ES2105)是JavaScript语言的新标准,2015年6月正式发布后,得到了迅速推广,是目前业界超级活跃的计算机语言。《ES6标准入门(第2版)》是国内仅有的一本ES6教程,在前版基础上增补了大量内容——对标准进行了彻底的解读,所有新增的语法知识(包括即将发布的ES7)都给予了详细介绍,并且紧扣业界开发实践,给出了大量简洁易懂、可以即学即用的示例代码。

  《ES6标准入门(第2版)》为中级难度,适合对JavaScript语言或ES5已经有所了解的读者,用来提高水平,了解这门语言的新发展;也可当作参考手册,查寻ES6/ES7新增的语法点。

作者简介

  阮一峰,著名技术博客作者,JavaScript专家。专注于网站开发技术,超过十年。畅销书《黑客与画家》《软件随想录》的译者。

目录

第1章 ECMAScript6简介0011.1ECMAScript和JavaScript的关系0011.2ECMAScript的历史0011.3部署进度0021.4Babel转码器003命令行环境004浏览器环境005Node.js环境005在线转换0061.5Traceur转码器006直接插入网页006在线转换007命令行转换008Node.js环境的用法0081.6ECMAScript7009第2章 let和const命令0102.1let命令010基本用法010不存在变量提升011暂时性死区011不允许重复声明0122.2块级作用域013为什么需要块级作用域013ES6的块级作用域0132.3const命令0152.4跨模块常量0162.5全局对象的属性017第3章 变量的解构赋值0183.1数组的解构赋值018基本用法018默认值0203.2对象的解构赋值0213.3字符串的解构赋值0243.4数值和布尔值的解构赋值0243.5函数参数的解构赋值0243.6圆括号问题025不能使用圆括号的情况025可以使用圆括号的情况0263.7用途026第4章 字符串的扩展0294.1字符的Unicode表示法0294.2codePointAt()0304.3String.fromCodePoint()0314.4字符串的遍历器接口0314.5at()0324.6normalize()0324.7includes(),startsWith(),endsWith()0334.8repeat()033目录XII目录4.9padStart(),padEnd()0344.10模板字符串0344.11实例:模板编译0374.12标签模板0384.13String.raw()042第5章 正则的扩展0435.1RegExp构造函数0435.2字符串的正则方法0435.3u修饰符0435.4y修饰符0455.5sticky属性0475.6flags属性0485.7RegExp.escape()048第6章 数值的扩展0496.1二进制和八进制数值表示法0496.2Number.isFinite(),Number.isNaN()0496.3Number.parseInt(),Number.parseFloat()0516.4Number.isInteger()0516.5Number.EPSILON0516.6安全整数和Number.isSafeInteger()0526.7Math对象的扩展054Math.trunc()054Math.sign()054Math.cbrt()055Math.clz32()055Math.imul()056Math.fround()056Math.hypot()057对数方法057三角函数方法0586.8指数运算符058第7章 数组的扩展0597.1Array.from()0597.2Array.of()0617.3数组实例的copyWithin()0627.4数组实例的find()和findIndex()0637.5数组实例的fill()0637.6数组实例的entries()、keys()和values()0647.7数组实例的includes()0647.8数组的空位0657.9数组推导067第8章 函数的扩展0698.1函数参数的默认值069基本用法069与解构赋值默认值结合使用070参数默认值的位置071函数的length属性072作用域073应用0748.2rest参数0748.3扩展运算符075含义075替代数组的apply方法076扩展运算符的应用0778.4name属性0798.5箭头函数080基本用法080使用注意点081嵌套的箭头函数0838.6函数绑定0848.7尾调用优化085什么是尾调用085尾调用优化086XIII目录尾递归087递归函数的改写0888.8函数参数的尾逗号089第9章 对象的扩展0909.1属性的简洁表示法0909.2属性名表达式0929.3方法的name属性0939.4Object.is()0949.5Object.assign()0959.6属性的可枚举性0979.7属性的遍历0989.8__proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()0999.9对象的扩展运算符101第10章 Symbol10310.1概述10310.2作为属性名的Symbol10510.3实例:消除魔术字符串10610.4属性名的遍历10710.5Symbol.for(),Symbol.keyFor()10910.6内置的Symbol值110Symbol.hasInstance110Symbol.isConcatSpreadable110Symbol.species111Symbol.match111Symbol.replace112Symbol.search112Symbol.split112Symbol.iterator112Symbol.toPrimitive113Symbol.toStringTag113Symbol.unscopables114第11章 Proxy和Reflect11611.1Proxy概述11611.2Proxy实例的方法119get()119set()121apply()122has()123construct()123deleteProperty()124defineProperty()125enumerate()125getOwnPropertyDescriptor()126getPrototypeOf()126isExtensible()127ownKeys()127preventExtensions()128setPrototypeOf()12811.3Proxy.revocable()12911.4Reflect概述12911.5Reflect对象的方法130第12章 二进制数组13312.1ArrayBuffer对象134概述134ArrayBuffer.prototype.byteLength135ArrayBuffer.prototype.slice()135ArrayBuffer.isView()13612.2TypedArray视图136概述136构造函数136数组方法138字节序140BYTES_PER_ELEMENT属性141ArrayBuffer与字符串的互相转换142溢出142XIV目录TypedArray.prototype.buffer143TypedArray.prototype.byteLength,TypedArray.prototype.byteOffset143TypedArray.prototype.length143TypedArray.prototype.set()144TypedArray.prototype.subarray()144TypedArray.prototype.slice()144TypedArray.of()144TypedArray.from()14512.3复合视图14512.4DataView视图14612.5二进制数组的应用148AJAX148Canvas148WebSocket149FetchAPI149FileAPI149第13章 Set和Map数据结构15113.1Set151基本用法151Set实例的属性和方法152遍历操作15313.2WeakSet15513.3Map157Map结构的目的和基本用法157实例的属性和操作方法159遍历方法160与其他数据结构的互相转换16213.4WeakMap164第14章 Iterator和for...of循环16614.1Iterator的概念16614.2数据结构的默认Iterator接口16814.3调用Iterator接口的场合17214.4字符串的Iterator接口17314.5Iterator接口与Generator函数17414.6遍历器对象的return()、throw()17514.7for...of循环175数组175Set和Map结构177计算生成的数据结构177类似数组的对象178对象179与其他遍历语法的比较180第15章 Generator函数18115.1简介181基本概念181yield语句182与Iterator接口的关系18415.2next方法的参数18515.3for...of循环18715.4Generator.prototype.throw()18915.5Generator.prototype.return()19315.6yield*语句19415.7作为对象属性的Generator函数19915.8Generator函数的this20015.9Generator函数推导20115.10含义202Generator与状态机202Generator与协程20215.11应用203第16章 Promise对象20816.1Promise的含义20816.2基本用法20816.3Promise.prototype.then()21116.4Promise.prototype.catch()21216.5Promise.all()215XV目录16.6Promise.race()21616.7Promise.resolve()21616.8Promise.reject()21716.9两个有用的附加方法218done()218finally()21816.10应用219加载图片219Generator函数与Promise的结合21916.11async函数220第17章 异步操作和async函数22117.1基本概念221异步221回调函数221Promise22217.2Generator函数223协程223Generator函数的概念223Generator函数的数据交换和错误处理224异步任务的封装22417.3Thunk函数225参数的求值策略225Thunk函数的含义226JavaScript语言的Thunk函数226Thunkify模块227Generator函数的流程管理228Thunk函数的自动流程管理22917.4co模块230基本用法230co模块的原理230基于Promise对象的自动执行231co模块的源码232处理并发的异步操作23317.5async函数234含义234async函数的实现235async函数的用法236注意点236与Promise、Generator的比较238第18章 Class24018.1Class基本语法240概述240constructor方法243实例对象243name属性244Class表达式245不存在变量提升245严格模式24618.2Class的继承246基本用法246类的prototype属性和__proto__属性247extends的继承目标248Object.getPrototypeOf()249super关键字249实例的__proto__属性25018.3原生构造函数的继承25018.4Class的取值函数(getter)和存值函数(setter)25318.5Class的Generator方法25418.6Class的静态方法25418.7Class的静态属性25518.8new.target属性25618.9Mixin模式的实现258第19章 修饰器25919.1类的修饰25919.2方法的修饰261XVI目录19.3为什么修饰器不能用于函数26219.4core-decorators.js263@autobind263@readonly263@override263@deprecate(别名@deprecated)264@suppressWarnings26519.5使用修饰器实现自动发布事件26519.6Mixin26619.7Trait26719.8Babel转码器的支持269第20章 Module27020.1严格模式27120.2export命令27120.3import命令27220.4模块的整体加载27320.5module命令27420.6exportdefault命令27420.7模块的继承27620.8ES6模块加载的实质27720.9循环加载278CommonJS模块的加载原理279CommonJS模块的循环加载279ES6模块的循环加载28020.10ES6模块的转码282ES6moduletranspiler282SystemJS282第21章 编程风格28421.1块级作用域284let取代var284全局常量和线程安全285严格模式28521.2字符串28521.3解构赋值28521.4对象28621.5数组28821.6函数28821.7Map结构28921.8Class29021.9模块29121.10ESLint的使用292第22章 读懂ECMAScript规格29322.1概述29322.2相等运算符29322.3数组的空位29522.4数组的map方法296第23章 参考链接29923.1官方文件29923.2综合介绍29923.3let和const30223.4解构赋值30223.5字符串30323.6正则30423.7数值30423.8数组30423.9函数30523.10对象30623.11Proxy和Reflect30623.12Symbol30823.13二进制数组30823.14Set和Map30923.15Iterator31023.16Generator31123.17Promise对象31223.18Class31423.19Decorator31423.20Module31523.21工具316

前言/序言

  2012年年底,我开始动手做一个开源项目《JavaScript标准参考教程》(https://github.com/ruanyf/jstutorial)。原来的设想是将自己的学习笔记整理成一《ES 6 标准入门(第2版)》,哪里料到,这个项目不断膨胀,最后变成了关于ECMAScript5及其外围API的全面解读和参考手册,写了一年多还没写完。

  那个项目的最后一章就是ECMAScript6的语法简介。那一章也是越写越长,最后我不得不决定,把它独立出来,作为一个新项目,也就是您现在看到的这《ES 6 标准入门(第2版)》。

  JavaScript已经是互联网开发的第一大语言,而且正在变成一种全领域的语言。著名程序员JeffAtwood甚至提出了一条“Atwood定律”:“所有可以用JavaScript编写的程序,最终都会出现JavaScript的版本。”(AnyapplicationthatcanbewritteninJavaScriptwilleventuallybewritteninJavaScript.)

  ECMAScript正是JavaScript的国际标准,这就决定了该标准的重要性。而ECMAScript6是ECMAScript历史上最大的一次版本升级,在语言的各个方面都有极大的变化,即使是熟练的JavaScript程序员,也需要重新学习。由于ES6的设计目标是企业级开发和大型项目,所以可以预料,除了互联网开发者,将来还会有大量应用程序开发者(甚至操作系统开发者)成为ES6的学习者。

  我写作这《ES 6 标准入门(第2版)》的目标,就是想为上面这些学习者,提供一本篇幅较短、简明易懂、符合中文表达习惯的ES6教程。它由浅入深、循序渐进,既有重要概念的讲解,又有API接口的罗列,便于日后当作参考手册查阅,还提供大量示例代码,让读者不仅一看就懂,还能举一反三,直接复制用于实际项目之中。

  需要声明的是,为了突出重点,《ES 6 标准入门(第2版)》只涉及ES6与ES5的不同之处,不对JavaScript已有的语法做全面讲解,毕竟市场上这样的教程已有很多了。因此,《ES 6 标准入门(第2版)》不是JavaScript入门教材,不适合初学者。阅读《ES 6 标准入门(第2版)》之前,需要对JavaScript的基本语法有所了解。

  我本人也是一个ES6的学习者,不敢说自己有多高的水平,只是较早地接触了这个主题,持续地读了许多资料,追踪标准的进展,做了详细的笔记而已。虽然我尽了最大努力,并且原稿在GitHub上公开后,已经得到了大量的勘误,但是《ES 6 标准入门(第2版)》的不如人意之处恐怕还是有不少。

  阮一峰

  2014年6月4日,写于上海阮一峰

  2014年6月4日,写于上海


其他推荐