参考链接
参考链接官方文件 ECMAScript® 2015 Language Specification: ECMAScript 2015 规格 ECMAScript® 2016 Language Specification: ECMAScript 2016 规格 ECMAScript® 2017 Language Specification:ECMAScript 2017 规格(草案) ECMAScript Current Proposals: ECMAScript 当前的所有提案 ECMAScript Active Proposals: 已经进入正式流程的提案 ECMAscript proposals:从阶段 0 到阶段 4 的所有提案列表 TC39 meeting agendas: TC39 委员会历年的会议记录 ECMAScript Daily: TC39 委员会的动态 The TC39 Process: 提案进入正式规格的流程 TC39: A Process Sketch, Stages 0 and 1: Stage 0 和 Stage 1 的含义 TC39 Process S...
变量的解构赋值
变量的解构赋值数组的解构赋值基本用法ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 以前,为变量赋值,只能直接指定值。 123let a = 1;let b = 2;let c = 3; ES6 允许写成下面这样。 1let [a, b, c] = [1, 2, 3]; 上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。下面是一些使用嵌套数组进行解构的例子。 1234567891011121314151617181920let [foo, [[bar], baz]] = [1, [[2], 3]];foo; // 1bar; // 2baz; // 3let [, , third] = ["foo", "bar", "baz"];third; // "baz"let [x, , y] = [1, 2, 3];x; // 1y; // 3l...
字符串的扩展
字符串的扩展ES6 加强了对 Unicode 的支持,并且扩展了字符串对象。 字符的 Unicode 表示法JavaScript 允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。 12"\u0061";// "a" 但是,这种表示法只限于码点在\u0000~`\uFFFF`之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。 12345"\uD842\uDFB7";// "𠮷""\u20BB7";// " 7" 上面代码表示,如果直接在\u后面跟上超过0xFFFF的数值(比如\u20BB7),JavaScript 会理解成\u20BB+7。由于\u20BB是一个不可打印字符,所以只会显示一个空格,后面跟着一个7。 ES6 对这一点做出了改进,只要将码点放入大括号,就能正确解读该字符。 1234567891011"\u{20BB7}";// "𠮷&...
对象的扩展
对象的扩展属性的简洁表示法ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 123456const foo = "bar";const baz = { foo };baz; // {foo: "bar"}// 等同于const baz = { foo: foo }; 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值。下面是另一个例子。 1234567891011function f(x, y) { return { x, y };}// 等同于function f(x, y) { return { x: x, y: y };}f(1, 2); // Object {x: 1, y: 2} 除了属性简写,方法也可以简写。 12345678910111213const o = { method() &...
数值的扩展
数值的扩展二进制和八进制表示法ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示。 120b111110111 === 503; // true0o767 === 503; // true 从 ES5 开始,在严格模式之中,八进制就不再允许使用前缀0表示,ES6 进一步明确,要使用前缀0o表示。 123456789101112// 非严格模式(function () { console.log(0o11 === 011);})()( // true // 严格模式 function () { "use strict"; console.log(0o11 === 011); })(); // Uncaught SyntaxError: Octal literals are not allowed in strict mode. 如果要将0b和0o前缀的字符串数值转为十进制,要使用Number方法。 12Number("0b111"); //...
数组的扩展
数组的扩展扩展运算符含义扩展运算符(spread)是三个点(...)。它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列。 12345678console.log(...[1, 2, 3])// 1 2 3console.log(1, ...[2, 3, 4], 5)// 1 2 3 4 5[...document.querySelectorAll('div')]// [<div>, <div>, <div>] 该运算符主要用于函数调用。 12345678910function push(array, ...items) { array.push(...items);}function add(x, y) { return x + y;}const numbers = [4, 38];add(...numbers); // 42 上面代码中,array.push(...items)和add(...numbers)这两行,都是函数的调用,它们的都使用了扩展运算符。...
最新提案
最新提案本章介绍一些尚未进入标准、但很有希望的最新提案。 do 表达式本质上,块级作用域是一个语句,将多个操作封装在一起,没有返回值。 1234{ let t = f(); t = t * t + 1;} 上面代码中,块级作用域将两个语句封装在一起。但是,在块级作用域以外,没有办法得到t的值,因为块级作用域不返回值,除非t是全局变量。 现在有一个提案,使得块级作用域可以变为表达式,也就是说可以返回值,办法就是在块级作用域之前加上do,使它变为do表达式,然后就会返回内部最后执行的表达式的值。 1234let x = do { let t = f(); t * t + 1;}; 上面代码中,变量x会得到整个块级作用域的返回值(t * t + 1)。 do表达式的逻辑非常简单:封装的是什么,就会返回什么。 12345// 等同于 <表达式>do { <表达式>; }// 等同于 <语句>do { <语句> } do表达式的好处是可以封装多个语句...
正则的扩展
正则的扩展RegExp 构造函数在 ES5 中,RegExp构造函数的参数有两种情况。 第一种情况是,参数是字符串,这时第二个参数表示正则表达式的修饰符(flag)。 123var regex = new RegExp("xyz", "i");// 等价于var regex = /xyz/i; 第二种情况是,参数是一个正则表示式,这时会返回一个原有正则表达式的拷贝。 123var regex = new RegExp(/xyz/i);// 等价于var regex = /xyz/i; 但是,ES5 不允许此时使用第二个参数添加修饰符,否则会报错。 12var regex = new RegExp(/xyz/, "i");// Uncaught TypeError: Cannot supply flags when constructing one RegExp from another ES6 改变了这种行为。如果RegExp构造函数第一个参数是一个正则对象,那么可以使用第二个参数指定修饰符。而且,返回的正则表达式...
编程风格
编程风格本章探讨如何将 ES6 的新语法,运用到编码实践之中,与传统的 JavaScript 语法结合在一起,写出合理的、易于阅读和维护的代码。 多家公司和组织已经公开了它们的风格规范,下面的内容主要参考了 Airbnb 公司的 JavaScript 风格规范。 块级作用域(1)let 取代 var ES6 提出了两个新的声明变量的命令:let和const。其中,let完全可以取代var,因为两者语义相同,而且let没有副作用。 123456789"use strict";if (true) { let x = "hello";}for (let i = 0; i < 10; i++) { console.log(i);} 上面代码如果用var替代let,实际上就声明了两个全局变量,这显然不是本意。变量应该只在其声明的代码块内有效,var命令做不到这一点。 var命令存在变量提升效用,let命令没有这个问题。 123456"use strict";if (true) &...
读懂 ECMAScript 规格
读懂 ECMAScript 规格概述规格文件是计算机语言的官方标准,详细描述语法规则和实现方法。 一般来说,没有必要阅读规格,除非你要写编译器。因为规格写得非常抽象和精炼,又缺乏实例,不容易理解,而且对于解决实际的应用问题,帮助不大。但是,如果你遇到疑难的语法问题,实在找不到答案,这时可以去查看规格文件,了解语言标准是怎么说的。规格是解决问题的“最后一招”。 这对 JavaScript 语言很有必要。因为它的使用场景复杂,语法规则不统一,例外很多,各种运行环境的行为不一致,导致奇怪的语法问题层出不穷,任何语法书都不可能囊括所有情况。查看规格,不失为一种解决语法问题的最可靠、最权威的终极方法。 本章介绍如何读懂 ECMAScript 6 的规格文件。 ECMAScript 6 的规格,可以在 ECMA 国际标准组织的官方网站(www.ecma-international.org/ecma-262/6.0/)免费下载和在线阅读。 这个规格文件相当庞大,一共有 26 章,A4 打印的话,足足有 545 页。它的特点就是规定得非常细致,每一个语法行为、每一个函数的实现都做了详尽的清晰的描...



