设为首页 收藏本站
查看: 2043|回复: 0

[经验分享] ES6新特性:Function函数扩展, 扩展到看不懂

[复制链接]

尚未签到

发表于 2017-2-25 11:04:59 | 显示全部楼层 |阅读模式
  本文所有Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用

  函数的默认值:
  如果有参数 ,那就用参数, 如果没有参数, 那就用默认的参数;
  ajax的请求经常要做这些判断, ES6规定了新的表达式, 让判断参数的逻辑更加简单;



function fn(a = 1, b = 2, c = 3) {
console.log(a,b,c);
}
fn(); //输出 1, 2, 3;
fn(4,5,6); //输出 4, 5, 6
  如果调用函数的时候不想给函数传参, 用函数的默认值, 那么要传一个undefined;



function fn(a = 1, b = 2, c = 3) {
console.log(a,b,c);
}
fn(undefined, 1 ,2); //输出 1, 1, 2
// 以下这种写法, 会要报异常的;
fn( , 1 ,2);
  要注意的一种情况, 如果要给函数传了默认值, 函数的length为: 该函数预期传入的参数的长度, 不包含已经定义默认值的参数;



function fn(a = 1, b = 2, c = 3) {
};
console.log(fn.length); //输出: 0
  函数默认值也可以是一个函数;



function fn(x,y,f = (x,y) => x*y ) {
return f(x,y);
};
console.log( fn(4,5) ); //输出:20
console.log( fn(4,5, (x,y) => x+y) ); //输出:9
  函数默认值得一个实际应用, 设置一个参数为必须传, 不传者报错;



function fn( foo = (()=>{throw new Error("Missing parameter")})()) {
console.log(foo)
}
fn(1);
fn(); //如果没有传参数 , 那么会抛 异常;
  rest参数和扩展运算符
  rest参数和扩展运算符这两个表达式是相反的操作, 用处比较广, 方便了不少
  function (...args) {}这里面的...args就叫做rest参数;
  ...[1,2,3,4]这种方式叫做扩展运算符;
  下面这个Demo可以看出来 arr[...arr]是相等的,  这个等式适用于一般的数组:



let arr = [1,2,3,4];
console.log( arr.toString() ===[...arr].toString() ); //输出  : true
  rest参数, 一般都是作为定义函数时候的参数, 一般是function( (...args) ){}或者function (foo, bar, ...args) {} 这样用的:



let fn = (...args) => {
return args;
};
console.log(fn(1,2,3,4));  // 输出 : [ 1, 2, 3, 4 ]
  获取元素的最小值的demo, 虽然没有什么卵用



let min = (...args) => {
return  Math.min.apply(null, typeof args[0] === "object" ? args[0] : args);
};
console.log(min([2,1,5,7,-2])); //输出 -2;
console.log(min(2,1,5,7,-2)); //输出 -2;
  ...rest 这种获取参数的方式不能用默认值, 否则要抛异常;



let min = (...args = [2,1]) => {
return Math.min.apply(null, args);
};
console.log(min());

  扩展运算符的使用:



let args = [1,2,3,4];
console.log(...args);
  扩展运算符能用作函数的调用, 没发现其他的好处:



let fn = function (...args) {
let insideFn = () => {
console.log(arguments);
};
insideFn(...args);
};
console.log( fn(1,2,3,4) );
  实际应用,我们想给一个数组的头部加一个数据,尾部再加一个数据;



let fn = function(...args ) {
console.log(args)
};
let arr = [1,2,3,4];
fn(0,...arr,5); //输出 [ 0, 1, 2, 3, 4, 5 ]
  或者用来合并数组:



console.log([...[1,2],...[3,4],...[5,6]]); //输出[ 1, 2, 3, 4, 5, 6 ]

let [arr0, arr1, arr2] = [[0],[1],[2]];
console.log([...arr0,...arr1, ...arr2] ); //输出 : [ 0, 1, 2 ]
  扩展运算符内部调用的是Inerator接口, 只要是具有Iterator接口的对象,都可以用扩展运算符,比如Map和Generator:



let map = new Map([
[1,"one"],
[2,"two"],
[3,"three"]
]);
console.log(...map.keys()); // 1 2 3
console.log(...map.values()); //one two three


let fn = function* () {
yield 1;
yield 2;
yield 3;
yield 4;
};
console.log( ...fn() ); //输出 1 2 3 4;
  ES6的箭头函数:
  ES5和ES3定义函数基本都这样:



function Fn() {
}   
  ES6以后就厉害了, 我们还能用箭头函数表达一个函数, 如下表示的是返回参数的平方:



let fn = (x) => x*x;
console.log(fn(10));
  在使用箭头函数的时候, 要直接返回 一个对象的话,return的对象要用括号()括起来, 因为大括号是底层开始解释js代码标志, 所以用括号括起来;



let fn = () => ({a:10,b:20});
console.log(fn())
  箭头函数的this指向一定要注意:



let fn = () => {
return this;
};
console.log(fn); //此时的this为fn;

let fn1 = () => console.log(this); //如果是在浏览器环境运行的话, 那么此时this为window,如果在node环境下运行this为undefined;
fn1();
  箭头函数里面的this不是调用箭头函数的this, 箭头函数虽然也有自己的作用域链, 但是箭头函数没有this, 箭头函数的this为:离箭头函数最近的一个通过function(){}创建的函数的this, 说不清的话, 看下Demo....



(function fn(){
let Fn =  ()  => {
this.x = 0;
this.y = 1;
return this;
};
//Fn = Fn.bind(new Object);
console.log( Fn.call(new Object) ); //输出结果: { obj: 1, x: 0, y: 1 }
}.bind({obj:1}))();
  以上Demo能够说明, 箭头函数的作用域内的this和谁调用它没有关系
  当然, 箭头函数的this跟方法也没有关系;



(function() {
let obj = {
method : () => {
console.log(this);
}
};
obj.method();
}.bind("hehe"))()
  也正因为箭头函数的this和箭头函数一点关系都没有, 所以箭头函数不能作为构造函数
  箭头函数的内部无法获取到arguments;
  箭头函数不能作为Generator;

  ES7提供了一个很方便去绑定作用域的写法
  ES3和ES5和ES6, 绑定作用域都用bind, 或者call, 或者apply, 好家伙, 现在用:: 两个冒号



foo::bar;
// 等同于
bar.bind(foo);
const hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwn(obj, key) {
return obj::hasOwnProperty(key);
};
*/

let query = document.querySelectorAll.bind(document)
等同于:
let query = document::document.querySelectorAll;

  参考:
  Arrow functions : https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions
  ruanyifeng:http://es6.ruanyifeng.com/#docs/function
作者: NONO
出处:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346981-1-1.html 上篇帖子: 搭建前端私有npm杂记 下篇帖子: Web前端开发推荐书籍
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表