阿里云最近在作活动,低至2折,有兴趣能够看看:
https://promotion.aliyun.com/...
为了保证的可读性,本文采用意译而非直译。html
想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你!前端
EcmaScript 2015(ES6)已经出来好几年了,能够巧妙地使用各类新功能。列出并讨论其中一些,你会发现它们颇有用。若是你知道其余好方法,请在评论中回复,共同窗习。git
ES6提供了默认参数值,没有该参数的状况下调用函数时使用的默认值。es6
在如下示例中,将required()函数设置为 a 和 b 参数的默认值。 这意味着若是未传递a或b,则调用required()函数,将收到错误。github
const required = () => {throw new Error('Missing parameter')}; //The below function will trow an error if either "a" or "b" is missing. const add = (a = required(), b = required()) => a + b; add(1, 2) //3 add(1) // Error: Missing parameter.
Array的reduce方法很是通用。它一般用于将项目数组转换为单个值,可是你能够用它作更多的事情。segmentfault
大多数这些技巧都依赖于初始值是数组或对象而不是像字符串或变量这样的简单值。
假设有一个项目列表的状况,而且想要更新每一个项目(即 Array.map 操做),而后只过滤几个项目(即 Array.filter ),这意味着须要两次循环遍历列表!数组
在下面的示例中,咱们但愿将数组中的项的值加倍,而后选择大于50的项。咱们使用强大的 reduce 方法高效的同时作到:ecmascript
const numbers = [10, 20, 30, 40]; const doubledOver50 = numbers.reduce((finalList, num) => { num = num * 2; //double each number (i.e. map) //filter number > 50 if (num > 50) { finalList.push(num); } return finalList; }, []); doubledOver50; // [60, 80]
若是仔细查看上面的示例(2.1),就会知道 reduce 能够代替 map 或 filter !async
// 返回 0 表示对称 const isParensBalanced = (str) => { return str.split('').reduce((counter, char) => { if (counter < 0) { // 匹配到 ')' 在 '(' 前面 return counter; } else if ( char === '(') { return ++counter; } else if ( char === ')') { return --counter; } else { return counter; //其它字符 } }, 0) // 初始化值为0 } isParensBalanced('(())') // 0 <---对称 isParensBalanced('(asdfds') // 0 <---对称 isParensBalanced('(()') // 1 <---不对称 isParensBalanced(')(') // 0 <---不对称
有时你但愿复制数组项或将数组转换为对象。 你可使用 reduce。函数
在下面的例子中,计算cars 中每一个值重复数量,并将这组对应的数据放到一个对象中:
var cars = ['BMW','Benz', 'Benz', 'Tesla', 'BMW', 'Toyota']; var carsObj = cars.reduce(function (obj, name) { obj[name] = obj[name] ? ++obj[name] : 1; return obj; }, {}); carsObj; // => { BMW: 2, Benz: 2, Tesla: 1, Toyota: 1 }
reduce 还能够作更多的事情,建阅读 MDN上列出的示例。
有时候你想挑拣须要的属性排除一些平须要的属性(多是由于它们包含敏感信息或者太大了)。咱们不须要遍历整个对象来挑拣它们,只需将这些不须要的数据提取到对应变量中,并将有用的保存在rest参数中。
在下面的示例中,咱们不须要的属性如_internal和tooBig属性,咱们能够将它们分配给_internal和tooBig变量(名字要同样),并将剩余的保存到在 rest parameter cleanObject 参数中:
let {_internal, tooBig, ...cleanObject} = {el1: '1', _internal:"secret", tooBig:{}, el2: '2', el3: '3'}; console.log(cleanObject); // {el1: '1', el2: '2', el3: '3'}
在下面的示例中,engine 属性是 car 对象的一个内嵌对象。若是咱们想获取 engine 中的 vin 值,可使用如下解构方式:
var car = { model: 'bmw 2018', engine: { v6: true, turbo: true, vin: 12345 } } const modelAndVIN = ({model, engine: {vin}}) => { console.log(`model: ${model} vin: ${vin}`); } modelAndVIN(car); // => model: bmw 2018 vin: 12345
ES6附带了一个扩展操做符(由三个点表示)。它一般用于解构数组值,但也能够在对象上使用它。
在下面的示例中,咱们使用扩展操做符(...)在新对象中进行扩展。第二个对象中的属性键将覆盖第一个对象中的属性键:
let object1 = { a:1, b:2,c:3 } let object2 = { b:30, c:40, d:50} let merged = {…object1, …object2} //spread and re-add into merged console.log(merged) // {a:1, b:30, c:40, d:50}
在ES6中,可使用 set 轻松时行数组去重,由于 set 只容许存储唯一的值:
let arr = [1, 1, 2, 2, 3, 3]; let deduped = [...new Set(arr)] // [1, 2, 3]
使用扩展运算符(...) 将 set 转换为数组很简单且在集合上使用全部数组方法!
let mySet = new Set([1,2, 3, 4, 5]); var filtered = [...mySet].filter((x) => x > 3) // [4, 5]
let param1 = 1; let param2 = 2; [param1, param2] = [param2, param1]; console.log(param1) // 2 console.log(param2) // 1
在下面的例子中,咱们在/post获取一个post,并在/comments 获取相关 comments 。因为使用 async/wait
,该函数以数组的形式返回结果。使用数组析构,咱们能够直接将结果赋值到相应的变量中。
async function getFullPost(){ return await Promise.all([ fetch('/post'), fetch('/comments') ]); } const [post, comments] = getFullPost();
原文地址:https://medium.freecodecamp.o...
你的点赞是我持续分享好东西的动力,欢迎点赞!
干货系列文章汇总以下,以为不错点个Star,欢迎 加群 互相学习。
https://github.com/qq44924588...
我是小智,公众号「大迁世界」做者,对前端技术保持学习爱好者。我会常常分享本身所学所看的干货,在进阶的路上,共勉!
关注公众号,后台回复福利,便可看到福利,你懂的。