【Next】一次掌握ES6到ES8新增功能
转自 https://medium.freecodecamp.org/here-are-examples-of-everything-new-in-ecmascript-2016-2017-and-2018-d52fa3b5a70e
作者 rajaraodv
感觉挺好的,就搬过来了,很多代码值得敲一遍多多回顾理解
Array
Array.prototype.includes
找到数组中是否包含某项,直接返回布尔值(能找到NaN)
1 | const arr = [1,2,3,4,NaN] |
Object
1. Object.values()
这个还好,我们已经在使用了,原来还是es7的。Object.values()是一个类似于Object.keys()的新函数,但是它返回了对象自身属性的所有值,不包括原型链中的任何值。
1 | const cars = {BMW: 3, Tesla: 2, Toyota: 1} |
2. Object.entries()
同上,返回的是 由键值对组成的数组的数组集合~ 好像解释得绕了,我们还是看代码吧:
1 | const cars = {BMW: 3, Tesla: 2, Toyota: 1} |
3. Object.getOwnPropertyDescriptors
该方法返回给定对象的所有属性的所有细节(包括getter getand setter set方法)。
添加这一功能的主要动机是允许浅层复制/克隆一个对象到另一个对象,该对象也复制getter和setter函数。
而`Object.assign 浅复制原始源对象的getter和setter函数外的所有细节。
1 | let Car = { |
1 | let oCar = Object.assign({}, Car) |
4. 剩余对象属性
点点点的扩展,- - 其实用得很多了,比如写redux里经常~~
1 | let {firstName, age, ...remaining } = { |
可以用这一点,删除对象中不需要的属性
1 | let {SSN, ...cleanObj} = { |
当然,还可以利用这一点扩展对象属性
1 | let p1 = {name: 'fri', age: 24} |
String
1. String padding 字符串填充
允许将空字符串或其他字符串添加到原始字符串的开头或结尾。直接上代码:
1 | '5'.padStart(10) // " 5" 不传第二个参数默认填充空格 |
我们来看一个高级点的用法,用于游戏,或是渲染字符串图片等很有用:
1 | const formatted = [0, 1, 12, 123, 1234, 12345].map(num => ( |
注:在Emojis和其他双字节字符上使用padStart和padEnd,一个emoji表情是2个字符
正则扩展
1. s
模式
这种增强使得点操作符可以匹配任何单个字符。为了确保这不会破坏任何东西,我们需要使用\s标志,当我们创建RegEx来工作时。
1 | /first.second/s.test('first\nsecond'); //true |
2. RegExp命名组捕获
在下面的例子中,我们使用(?<year>) (?<month>) (?<day>)
名称来分组日期RegEx的不同部分。产生的对象现在将包含具有属性年、月、日和相应值的组属性。
1 | // before |
3. 使用命名组
1 | let sameWords = /(?<fruit>apple|orange)==\k<fruit>/u; |
4. 在字符串中使用命名组
1 | let re = /(?<firstName>[A-Za-z]+) (?<lastName>[A-Za-z]+$)/u; |
5. 正则向后插入断言
1 | /(?<=#).*/.test('winning') // false |
之前我们写(?=) 这类匹配到的一般从[1]开始,这样写从[0]就可以匹配到,习惯了用之前的也行,毕竟这样会增加学习成本。
6. 正则匹配unicode
1 | //The following matches multiple hindi character |
Other
1. **
用来替代 Math.pow
1 | Math.pow(7, 2) // 49 7的2次方 |
2. 在函数参数中添加尾随逗号,现在不会报错了
3. async/await
这个用得也挺多了,同步写法的异步函数
1 | async function doubleAndAdd(a, b) { |
来看一个高级用法
1 | async function doubleAndAdd(a, b) { |
4. Promise.prototype.finally()
主要的想法是允许在解决或拒绝帮助清理问题之后运行回调。最后回调被调用,没有任何值,无论如何都要执行。可以理解为增加了一个生命周期钩子
1 | let started = true |
5. 异步迭代器
这是一个非常有用的特性。基本上,它允许我们轻松地创建异步代码的循环!
这个特性添加了一个新的“for-awaof”循环,它允许我们调用async函数,它在循环中返回承诺(或带有一堆承诺的数组)。
很酷的一点是,循环等待每个承诺在执行下一个循环之前解决。
1 | const promises = [ |
总结
Array方法
- Array.prototype.includes 是否包含某项,返回Boolean
Object方法
- Object.values() 迭代器 返回value组成的对象
- Object.entries() 迭代器,返回 k v组成的数组
- Object.getOwnPropertyDescriptors? 取某个属性能拿到getter setter
- 对象扩展 … 点点点
String方法
- padStart
- padEnd
正则扩展
- s模式 匹配换行等而不破坏字符串
- 命名组捕获
- 插入断言
- 匹配unicode
函数扩展
- async/await
- Promise.finally 钩子
- async函数里 for 可以使用 await
- 原生方法扩展 Math.pow ->
**