壹.1.1 新版 ECMAScript 特性分析
本书约定: 示例代码中注释里双右尖括号
>>
代表“打印/输出”的意思。JavaScript是一门支持多种编程范式的语言,灵活性很高,功能也十分强大。因为灵活性,JavaScript有很多种使用方式,被应用到浏览器、客户端软件、嵌入式硬件等多种场景下。在面向对象(OOP)这种编程范式大行其道的今天,这种变化多端的语言因其编程范式多样,每种场景下使用形态各异,使用者之间思维差别大,见解又各不相同,因此也就被误解得极深。正是由于这种相对的复杂性,前端工程师们有必要更系统、深入地对这门语言进行学习和研究。
现在,JavaScript在TC39(TC39由包括浏览器厂商在内的各方组成,他们开会推动JavaScript特性的提案沿着一条严格的流程推进)的推动下正加速地迭代更新,每年都会有一些新特性出现。前端工程师们有必要了解一下这些新特性,以便更好地在一线互联网企业发挥出自己的能量。
JavaScript起源于1995年Netscape为自家游览器创造的脚本语言LiveScript。后来因为Sun公司的Java语言兴起,Netscape为了沾热度将LiveScript改名为JavaScript,但其实Java和JavaScript没有一点关系。
1997年Netscape将JavaScript规范提交到 Ecma International(www.ecma-international.org,简称EI),诞生了ECMAScript (简称“ES”)第1个版本。
随后在1999年诞生了十分稳定的ES 3,也就是2009年12月之前前端工程师们最广泛使用的版本。
在2009年12月诞生了ES 5。你可能会问ES 4 呢,抱歉,版本4因为太激进,EI委员会成员之间的意见不一,最后胎死腹中,改由更加平滑温和的版本5继承版本4的一些新特性和功能。
EI于2015年6月发布了ES 6,也就是我们今天广泛使用的版本。这之后每年6月发布一个极小更新的ES版本,比如2016年6月发布的 ES 2016 叫做ES 7,而这个版本只增加了两个新特性。截止本书编写时,ES 11的提案已经定稿了。
综上可见,JavaScript是ECMAScript规范的一种实现。为方便读者理解交流,而且由于ECAMScript 6 之后变化并不是特别大,如果没有特别说明,本书后面讲述的JavaScript对应的规范默认为 ES 6。
ES 6 的新特性已经在“壹.2”节中重点讲述,本文下面会介绍ES 7~11的新特性。
新特性 | 中文说明 |
Array.prototype.includes | |
Exponentiation operator | 指数函数的中缀表示法 |
includes是一个Array上很有用的方法,用于快速查找数组中是否包含某个元素,包括NaN(所以和indexOf不一样)。
(() => {
let arr = [1, 2, 3, NaN];
if (arr.includes(2)) {
//查找2是否存在于arr数组中
console.log("找到了!"); //>> 找到了!
}
if (!arr.includes(2, 3)) {
//第二个参数3表示数组下标为3的项,也即第4项开始查找
console.warn("不存在!"); //>> 不存在!
}
//下面两句说明incluedes和indexOf的区别
console.log(arr.includes(NaN)); //true
console.log(arr.indexOf(NaN) != -1); //false
})();
这个是与
Math.pow
有关的特性,还记得i++
,x += x
这种写法吗,指数函数的中缀表示法与之类似。与python语言一样,JavaScript也采用两个星符号**
来表示Math.pow
。好处有两个:
a. 中缀表示法比函数表示法更简洁,这使它更可取。
b. 方便数学、物理、机器人学等领域的计算。用法示例如下:
//用法一:x ** y
let squared = 2 ** 2;//等同于: 2 * 2
let cubed = 2 ** 3;//等同于: 2 * 2 * 2
//用法二:x **= y
let a = 2;
a **= 2;//等同于: a = a * a;
let b = 3;
b **= 3;//等同于: b = b * b * b;
没错,是一块很甜的语法糖(指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用)。
新特性 | 中文说明 |
Object.values / Object.entries | |
String padding | 字符串追加 |
Object.getOwnPropertyDescriptors | |
Trailing commas in function parameter lists and calls | 结尾允许逗号 |
Async functions | 异步函数 |
Shared memory and atomics | 共享内存和 Atomics 对象 |
用法是
Object.values(obj)
,obj
可以是一个对象或者数组。const obj = { x: 'xxx', y: 1 };
Object.values(obj); // ['xxx', 1]
const obj = ['e', 's', '8']; // 等同于 { 0: 'e', 1: 's', 2: '8' };
Object.values(obj); // ['e', 's', '8']
//当把数字当做对象的键的时候,返回的数组以键的值升序排序
const obj = { 10: 'xxx', 1: 'yyy', 3: 'zzz' };
Object.values(obj); // ['yyy', 'zzz', 'xxx']
Object.values('es8'); // ['e', 's', '8']
Object.entries