你点的 ES6一些小技巧,请查收


Posted in Javascript onApril 25, 2018

ES6出来已经有好几年了,同时很多新特性可以被巧妙地运用在项目中。我想要列下其中一些,希望它们对你有用。

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

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();

查看更多我翻译的Medium文章请访问:

项目地址:https://github.com/WhiteYin/translation
SF专栏:https://segmentfault.com/blog/yin-translation

总结

以上所述是小编给大家介绍的你点的 ES6一些小技巧,请查收,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
document.createElement()用法
Mar 13 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
Jun 06 Javascript
jquery validate在ie8下的bug解决方法
Nov 13 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
Jquery基础教程之DOM操作
Aug 19 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
Aug 11 Javascript
jQuery弹出层插件popShow(改进版)用法示例
Jan 23 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
Feb 10 Javascript
JS实现的添加弹出层并完成锁屏操作示例
Apr 07 Javascript
webpack的CSS加载器的使用
Sep 11 Javascript
React SSR样式及SEO的实践
Oct 22 Javascript
Vue响应式原理Observer、Dep、Watcher理解
Jun 06 Javascript
vue 组件使用中的一些细节点
Apr 25 #Javascript
Vue中使用vue-i18插件实现多语言切换功能
Apr 25 #Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
Apr 25 #Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
Apr 25 #Javascript
vue短信验证性能优化如何写入localstorage中
Apr 25 #Javascript
详解Vue.js中.native修饰符
Apr 24 #Javascript
Vue 动态设置路由参数的案例分析
Apr 24 #Javascript
You might like
PHP n个不重复的随机数生成代码
2009/06/23 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
2015/03/06 Javascript
解析Vue2.0双向绑定实现原理
2017/02/23 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
react-redux中connect的装饰器用法@connect详解
2018/01/13 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
浅谈python内置变量-reversed(seq)
2017/06/21 Python
python DataFrame 修改列的顺序实例
2018/04/10 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
2018/12/15 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
Python3离线安装Requests模块问题
2019/10/13 Python
python turtle 绘制太极图的实例
2019/12/18 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
2020/02/12 Python
Python生成器实现简单&quot;生产者消费者&quot;模型代码实例
2020/03/27 Python
django项目中新增app的2种实现方法
2020/04/01 Python
python 实现超级玛丽游戏
2020/11/25 Python
详解CSS3中字体平滑处理和抗锯齿渲染
2017/03/29 HTML / CSS
Nordgreen英国官网:斯堪的纳维亚设计师手表
2018/10/24 全球购物
blueseventy官网:铁人三项和比赛泳衣
2021/02/06 全球购物
Python的两道面试题
2013/06/29 面试题
汽车检测与维修专业求职信
2013/10/30 职场文书
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
业务代表的岗位职责
2013/11/16 职场文书
企业文化理念标语
2014/06/10 职场文书
任命书标准格式
2015/03/02 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python