ES6 中可以提升幸福度的小功能


Posted in Javascript onAugust 06, 2018

一、变量解构赋值的用途

1)交换变量的值

let x = 1;
let y = 2;
[x, y] = [y, x]

2)从函数返回多个值

// 返回一个数组
function example(){
  return [1, 2, 4];
}
let [a, b, c] = example() 
// 返回一个对象
function example(){
  return {
    foo:1,
    bar: 2
  }
}
let {foo, bar} = example(); 或者 ( {foo, bar} = example() )

3)提取JSON数据

let jsonData = {
 id:42,
 status: "OK",
 data: [867, 5309]
};
let { id, status, data: number} = jsonData;

4)输入模块的指定方法

加载模块时,往往需要指定输入的方法,解构赋值使得输入语句非常清晰

const { SourceMapConsumer, SourceNode } = require("source-map")

5) 数组复制的功能

在es5中,开发者经常使用 concat() 方法克隆数组:

// 在 es5 中克隆数组
var colors = [ 'red', 'green', 'blue' ];
var clonedColors = colors.concat();
console.log(clonedColors); // "[red, green, blue]"

concat() 方法的设计初衷是连接两个数组,如果调用时不传递参数就会返回当前数组的副本。在es6中可以通过不定元素的语法来实现相同的目标:

let colors = [ 'red', 'green', 'blue' ]
let [ ...clonedColors ] = colors;
console.log(clonedColors); // "[red, green, blue]"

6) 结合Set集合,创建一个无重复元素的数组

function eliminateDuplicates(items) {
  return [...new Set(items)]
}
let numbers = [1, 2, 3, 3, 3, 4, 5];
let noDuplicates = eliminateDuplicates(numbers );
console.log(noDuplicates ); // [1,2,3,4,5]

7) 使用apply 把两个数据合并成一个

var arra1 = [{
 name: '小智',
 age: 26
}]
var arra2 = [{
 name: '大智',
 age: 27
}]
arra1.push.apply(arra1, arra2)
console.log(arra1)

二、函数的用处(常见就不多说了)

1)创建立即执行函数表达式

// es5
let person = function(name) {
 return {
  getName: function() {
   return name;
  }
 }
}('小智');
console.log(person.getName()); // 小智

在这段代码中,立即执行函数表达式创建了一个包含getName() 方法的新对象,将参数 name 作为该对象的一个私有成员返回给函数的调用者。

只要箭头函数包裹在小括号里,就可以用它实现相同的功能

// es6
let person = ((name) => {
 return {
  getName: function() {
   return name;
  }
 }
})('小智2');
console.log(person.getName()); //小智

2.利用参数默认值可以指定某一个参数不得省略,如果省略就抛出一个错误。

function throwEmptyError() {
  throw new Error('参数不能为空');
}
function foo(mustBeParams = throwEmptyError() ){
  return mustBeParams();
}
foo() // 参数不能为空

三、扩展对象的功能性让代码更加简洁

1) 可计算属性名

在es6中,使用方括号可以计算属性名称,如

let lastName ='last name';
let person = {
  "first name": 'Nicholas',
  [lastName]: 'Zakas'
}
console.log(person['first name']); // "Nicholas"
console.log(person[lastName]); // Zakas

2) 利用 Object.assign()合并两个对象

function request(options) {
 let defaultOptions = {
  port: 8000,
  type: 'get'
 }
 Object.assign(options,defaultOptions);
 console.log(options)
}
request({url: 'http://www.baidu.com'})

四、结合es6简洁函数写法,高阶函数的应用

1) tab 函数

// 此处tap函数接受一个 vaule 并返回一个包含value 闭包函数,该函数被执行
const tap = (value) => (fn) => (
 typeof(fn) === 'function' && fn(value),
 console.log(value)
)

tab函数用处:假设你在遍历一个来自服务器的数组,并发现数据错了,因此你想调试一下,看看数组包含了什么,就可以用 tab函数

[1, 2 ,3, 4].forEach((a) => {
 tap(a)((a)=> {
  console.log(a)
 })
});
#### 2) once 函数

在很多情况下,我们只需要运行一次给定的函数,发起一次银行支付请求等,这时就可以用到 once 函数。

const once = (fn) => {
  let done = false;
  return function () {
    return done?undefined:((done=true),fn.apply(this,arguments))
  }
}
const doPayment = once(()=>{
 console.log('payment is done')
})
doPayment(); // payment is done
console.log(doPayment()); //undefined
#### 3) 函数柯里化的应用

开发者编写代码的时候应用的不同阶级编写很多日志,我们可以编写一个如下的日志函数:

const loggerHelper = (mode, initialMessage, errorMessage, lineNo) => {
 if (mode === 'DEBUG') {
  console.debug(initialMessage,errorMessage + 'at line:' + lineNo)
 }
 else if (mode === 'ERROR') {
  console.error(initialMessage,errorMessage + 'at line:' + lineNo)
 }
 else if (mode === 'WARN') {
  console.warn(initialMessage,errorMessage + 'at line:' + lineNo)
 }
 else
  throw "Wrong mode"
}

当开发者需要向控制台打印Stats.js文件中的错误时,可以用如下方式:

loggerHelper("ERROR", "ERROR At Stats.js", "Invalid argument passed", 23);

这样对于 我们追求完美可读的程序员来说,可能是不太能接受的,现在用柯里来优化以上代码,
先简要说明什么是函数柯里化:

柯里化是把一个多参数函数转换成一个嵌套的一元函数过程。  

封装一个把把多参数函数转制为一元函数的curry函数

let curry = (fn) => {
 if (typeof fn !== 'function') {
  throw Error('No function provided');
 }
 return function curriedFn(...args) {
  // 传入参数是否小于函数参数列表长度,
  if (args.length < fn.length) {
   return function() {
    return curriedFn.apply(null, args.concat([].slice.call(arguments)));
   }
  }
  return fn.apply(null, args)
 }
} 
let errorLogger = curry(loggerHelper)("ERROR")("ERROR At Stats.js");
let debugLogger = curry(loggerHelper)("DEBUG")("ERROR")("Debug At Stats.js");
let warnLogger = curry(loggerHelper)("WARN")("Warn")("At Stats.js");
// 用于错误
errorLogger("Error message", 21)
// 用于调试
debugLogger('Debug message', 233)
// 用于警告
warnLogger("Warn message", 34);

现在我们能够轻松引用上面的柯里化并在各自的上下文中使用它们了。

总结

以上所述是小编给大家介绍的ES6 中可以提升幸福度的小功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
JS实现网页背景颜色与select框中颜色同时变化的方法
Feb 27 Javascript
EasyUI中combobox默认值注意事项
Mar 01 Javascript
JavaScript原生xmlHttp与jquery的ajax方法json数据格式实例
Dec 04 Javascript
jquery基本选择器匹配多个元素的实现方法
Sep 05 Javascript
Javascript中常用的检测方法小结
Oct 08 Javascript
微信公众号支付H5调用支付解析
Nov 04 Javascript
js实现音频控制进度条功能
Apr 01 Javascript
babel之配置文件.babelrc入门详解
Feb 22 Javascript
vue自定义指令用法经典实例小结
Mar 16 Javascript
利用原生JS实现data方法示例代码
May 28 Javascript
JS+canvas五子棋人机对战实现步骤详解
Jun 04 Javascript
解决vue scoped scss 无效的问题
Sep 04 Javascript
原生JS实现的轮播图功能详解
Aug 06 #Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
Aug 06 #Javascript
animate.css在vue项目中的使用教程
Aug 05 #Javascript
iconfont的三种使用方式详解
Aug 05 #Javascript
vue-content-loader内容加载器的使用方法
Aug 05 #Javascript
vue+element-ui集成随机验证码+用户名+密码的form表单验证功能
Aug 05 #Javascript
dts文件中删除一个node或属性的操作方法
Aug 05 #Javascript
You might like
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
15种PHP Encoder的比较
2007/03/06 PHP
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
js 自定义的联动下拉框
2010/02/07 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
javascript模块化是什么及其优缺点介绍
2013/09/02 Javascript
从QQ网站中提取的纯JS省市区三级联动菜单
2013/12/25 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
jQuery下拉友情链接美化效果代码分享
2015/08/26 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
[02:36]DOTA2上海特锦赛 回忆电竞生涯的重要瞬间
2016/03/25 DOTA
[01:32]寻找你心中的那团火 DOTA2 TI9火焰传递活动今日开启
2019/05/16 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
Python生成任意范围任意精度的随机数方法
2018/04/09 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
对python 生成拼接xml报文的示例详解
2018/12/28 Python
详解pandas删除缺失数据(pd.dropna()方法)
2019/06/25 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
python中rb含义理解
2020/06/18 Python
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
八皇后问题,输出了所有情况,不过有些结果只是旋转了90度
2016/08/15 面试题
学生实习自我鉴定
2013/10/11 职场文书
销售类求职信
2014/06/13 职场文书
Python图像处理之图像拼接
2021/04/28 Python
Python实现学生管理系统(面向对象版)
2021/06/24 Python
关于windows server 2012 DC 环境 重启后蓝屏代码:0xc00002e2的问题
2022/05/25 Servers