不得不知的ES6小技巧


Posted in Javascript onJuly 28, 2018

如果你还知道其他一些小技巧,欢迎留言~ 很高兴把它们补充进来。

1. 强制要求参数

ES6提供了默认参数值机制,允许你为参数设置默认值,防止在函数被调用时没有传入这些参数。

在下面的例子中,我们写了一个required()函数作为参数a和b的默认值。这意味着如果a或b其中有一个参数没有在调用时传值,会默认required()函数,然后抛出错误。

const required = () => {throw new Error('Missing parameter')};

const add = (a = required(), b = required()) => a + b;

add(1, 2) //3
add(1) // Error: Missing parameter.

2. 强大的reduce

数组的reduce方法用途很广。它一般被用来把数组中每一项规约到单个值。但是你可以利用它做更多的事。

2.1 使用reduce同时实现map和filter

假设现在有一个数列,你希望更新它的每一项(map的功能)然后筛选出一部分(filter的功能)。如果是先使用map然后filter的话,你需要遍历这个数组两次。

在下面的代码中,我们将数列中的值翻倍,然后挑选出那些大于50的数。有注意到我们是如何非常高效地使用reduce来同时完成map和filter方法的吗?

const numbers = [10, 20, 30, 40];
const doubledOver50 = numbers.reduce((finalList, num) => { 
 num = num * 2;  
 if (num > 50) {
  finalList.push(num);
 } 
 return finalList;
}, []);
doubledOver50; // [60, 80]

2.2 使用reduce取代map和filter

如果你认真阅读了上面的代码,你应该能理解reduce是可以取代map和filter的。

2.3 使用reduce匹配圆括号

reduce的另外一个用途是能够匹配给定字符串中的圆括号。对于一个含有圆括号的字符串,我们需要知道(和)的数量是否一致,并且(是否出现在)之前。

下面的代码中我们使用reduce可以轻松地解决这个问题。我们只需要先声明一个counter变量,初值为0。在遇到(时counter加一,遇到)时counter减一。如果左右括号数目匹配,那最终结果为0。

//Returns 0 if balanced.
const isParensBalanced = (str) => {
 return str.split('').reduce((counter, char) => {
  if(counter < 0) { //matched ")" before "("
   return counter;
  } else if(char === '(') {
   return ++counter;
  } else if(char === ')') { 
   return --counter;
  } else { //matched some other char
   return counter;
  }
  
 }, 0); //<-- starting value of the counter}
isParensBalanced('(())') // 0 <-- balanced
isParensBalanced('(asdfds)') //0 <-- balanced
isParensBalanced('(()') // 1 <-- not balanced
isParensBalanced(')(') // -1 <-- not balanced

2.4 统计数组中相同项的个数

很多时候,你希望统计数组中重复出现项的个数然后用一个对象表示。那么你可以使用reduce方法处理这个数组。

下面的代码将统计每一种车的数目然后把总数用一个对象表示。

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的相关代码示例。

3. 对象解构

3.1 删除不需要的属性

有时候你不希望保留某些对象属性,也许是因为它们包含敏感信息或仅仅是太大了(just too big)。你可能会枚举整个对象然后删除它们,但实际上只需要简单的将这些无用属性赋值给变量,然后把想要保留的有用部分作为剩余参数就可以了。

下面的代码里,我们希望删除_internal和tooBig参数。我们可以把它们赋值给internal和tooBig变量,然后在cleanObject中存储剩下的属性以备后用。

let {_internal, tooBig, ...cleanObject} = {el1: '1', _internal:"secret", tooBig:{}, el2: '2', el3: '3'};

console.log(cleanObject); // {el1: '1', el2: '2', el3: '3'}

3.2 在函数参数中解构嵌套对象

在下面的代码中,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

3.3 合并对象

ES6带来了扩展运算符(...)。它一般被用来解构数组,但你也可以用它处理对象。

接下来,我们使用扩展运算符来展开一个新的对象,第二个对象中的属性值会改写第一个对象的属性值。比如object2的b和c就会改写object1的同名属性。

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}

4. Sets

4.1 使用Set实现数组去重

在ES6中,因为Set只存储唯一值,所以你可以使用Set删除重复项。

let arr = [1, 1, 2, 2, 3, 3];
let deduped = [...new Set(arr)] // [1, 2, 3]

4.2 对Set使用数组方法

使用扩展运算符就可以简单的将Set转换为数组。所以你可以对Set使用Array的所有原生方法。

比如我们想要对下面的Set进行filter操作,获取大于3的项。

let mySet = new Set([1,2, 3, 4, 5]);
var filtered = [...mySet].filter((x) => x > 3) // [4, 5]

5. 数组解构

有时候你会将函数返回的多个值放在一个数组里。我们可以使用数组解构来获取其中每一个值。

5.1 数值交换

let param1 = 1;
let param2 = 2;
//swap and assign param1 & param2 each others values
[param1, param2] = [param2, param1];
console.log(param1) // 2
console.log(param2) // 1

5.2 接收函数返回的多个结果

在下面的代码中,我们从/post中获取一个帖子,然后在/comments中获取相关评论。由于我们使用的是async/await,函数把返回值放在一个数组中。而我们使用数组解构后就可以把返回值直接赋给相应的变量。

async function getFullPost(){
 return await Promise.all([
   fetch('/post'),
   fetch('/comments')
 ]);
}
const [post, comments] = getFullPost();

注:原文作者rajaraodv ,白吟灵译。

Javascript 相关文章推荐
Extjs中使用extend(js继承) 的代码
Mar 15 Javascript
关于js遍历表格的实例
Jul 10 Javascript
可简单避免的三个JS发布错误的详细介绍
Aug 02 Javascript
JavaScript闭包函数访问外部变量的方法
Aug 27 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
AngularJS入门教程之XHR和依赖注入详解
Aug 18 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
Nov 02 Javascript
vue上传图片组件编写代码
Jul 26 Javascript
原生js中ajax访问的实例详解
Sep 19 Javascript
Angular2使用vscode断点调试ts文件的方法
Dec 13 Javascript
js轮播图之旋转木马效果
Oct 13 Javascript
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
Jul 28 #Javascript
Angular6笔记之封装http的示例代码
Jul 27 #Javascript
Vue 中axios配置实例详解
Jul 27 #Javascript
vue中设置height:100%无效的问题及解决方法
Jul 27 #Javascript
vue中使用echarts制作圆环图的实例代码
Jul 27 #Javascript
vue 录制视频并压缩视频文件的方法
Jul 27 #Javascript
JavaScript事件对象event用法分析
Jul 27 #Javascript
You might like
一个简单的PHP投票程序源码
2007/03/11 PHP
PHP队列用法实例
2014/11/05 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
PHP正则表达式笔记与实例详解
2019/05/09 PHP
js调用flash的效果代码
2008/04/26 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
javascript 使用for循环时该注意的问题-附问题总结
2015/08/19 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
Jquery插件仿百度搜索关键字自动匹配功能
2016/05/11 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
Layui数据表格判断编辑输入的值,是否为我需要的类型详解
2019/10/26 Javascript
Vue export import 导入导出的多种方式与区别介绍
2020/02/12 Javascript
jquery实现轮播图特效
2020/04/12 jQuery
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
python实现sublime3的less编译插件示例
2014/04/27 Python
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Django 实现对已存在的model进行更改
2020/03/28 Python
python如何求圆的面积
2020/07/01 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
Hawes & Curtis澳大利亚官网:英国经典服饰品牌
2018/10/29 全球购物
荷兰天然和有机产品网上商城:BigGreenSmile.nl
2020/07/26 全球购物
领导班子四风对照检查材料思想汇报
2014/09/26 职场文书
中学总务处工作总结
2015/08/12 职场文书
TypeScript中条件类型精读与实践记录
2021/10/05 Javascript