本文所有Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 

  函数的默认值:

  如果有参数 ,那就用参数, 如果没有参数, 那就用默认的参数;

  ajax的请求经常要做这些判断, ES6规定了新的表达式, 让判断参数的逻辑更加简单;

  1. function fn(a = , b = , c = ) {
  2. console.log(a,b,c);
  3. }
  4. fn(); //输出 1, 2, 3;
  5. fn(,,); //输出 4, 5, 6

  如果调用函数的时候不想给函数传参, 用函数的默认值, 那么要传一个undefined;

  1. function fn(a = , b = , c = ) {
  2. console.log(a,b,c);
  3. }
  4. fn(undefined, ,); //输出 1, 1, 2
  5. // 以下这种写法, 会要报异常的;
  6. fn( , ,);

  要注意的一种情况, 如果要给函数传了默认值, 函数的length为: 该函数预期传入的参数的长度, 不包含已经定义默认值的参数;

  1. function fn(a = , b = , c = ) {
  2.  
  3. };
  4. console.log(fn.length); //输出: 0

  函数默认值也可以是一个函数;

  1. function fn(x,y,f = (x,y) => x*y ) {
  2. return f(x,y);
  3. };
  4. console.log( fn(,) ); //输出:20
  5. console.log( fn(,, (x,y) => x+y) ); //输出:9

  函数默认值得一个实际应用, 设置一个参数为必须传, 不传者报错;

  1. function fn( foo = (()=>{throw new Error("Missing parameter")})()) {
  2. console.log(foo)
  3. }
  4. fn();
  5. fn(); //如果没有传参数 , 那么会抛 异常;

  rest参数和扩展运算符

  rest参数和扩展运算符这两个表达式是相反的操作, 用处比较广, 方便了不少

  function (...args) {}这里面的...args就叫做rest参数;

  ...[1,2,3,4]这种方式叫做扩展运算符;

  下面这个Demo可以看出来 arr [...arr]是相等的,  这个等式适用于一般的数组:

  1. let arr = [,,,];
  2. console.log( arr.toString() ===[...arr].toString() ); //输出 : true

  rest参数, 一般都是作为定义函数时候的参数, 一般是function( (...args) ){}或者function (foo, bar, ...args) {} 这样用的:

  1. let fn = (...args) => {
  2. return args;
  3. };
  4. console.log(fn(,,,)); // 输出 : [ 1, 2, 3, 4 ]

  获取元素的最小值的demo, 虽然没有什么卵用

  1. let min = (...args) => {
  2. return Math.min.apply(null, typeof args[] === "object" ? args[] : args);
  3. };
  4. console.log(min([,,,,-])); //输出 -2;
  5. console.log(min(,,,,-)); //输出 -2;

  ...rest 这种获取参数的方式不能用默认值, 否则要抛异常;

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

  扩展运算符的使用:

  1. let args = [,,,];
  2. console.log(...args);

  扩展运算符能用作函数的调用, 没发现其他的好处:

  1. let fn = function (...args) {
  2. let insideFn = () => {
  3. console.log(arguments);
  4. };
  5. insideFn(...args);
  6. };
  7. console.log( fn(,,,) );

  实际应用,我们想给一个数组的头部加一个数据,尾部再加一个数据;

  1. let fn = function(...args ) {
  2. console.log(args)
  3. };
  4. let arr = [,,,];
  5. fn(,...arr,); //输出 [ 0, 1, 2, 3, 4, 5 ]

  或者用来合并数组:

  1. console.log([...[,],...[,],...[,]]); //输出[ 1, 2, 3, 4, 5, 6 ]
  2.  
  3. let [arr0, arr1, arr2] = [[],[],[]];
  4. console.log([...arr0,...arr1, ...arr2] ); //输出 : [ 0, 1, 2 ]

  扩展运算符内部调用的是Inerator接口, 只要是具有Iterator接口的对象,都可以用扩展运算符,比如Map和Generator:

  1. let map = new Map([
  2. [,"one"],
  3. [,"two"],
  4. [,"three"]
  5. ]);
  6. console.log(...map.keys()); // 1 2 3
  7. console.log(...map.values()); //one two three
  1. let fn = function* () {
  2. yield ;
  3. yield ;
  4. yield ;
  5. yield ;
  6. };
  7. console.log( ...fn() ); //输出 1 2 3 4;

  ES6的箭头函数:

  ES5和ES3定义函数基本都这样:

  1. function Fn() {
  2.  
  3. }

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

  1. let fn = (x) => x*x;
  2. console.log(fn());

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

  1. let fn = () => ({a:,b:});
  2. console.log(fn())

  箭头函数的this指向一定要注意:

  1. let fn = () => {
  2. return this;
  3. };
  4. console.log(fn); //此时的this为fn;
  5.  
  6. let fn1 = () => console.log(this); //如果是在浏览器环境运行的话, 那么此时this为window,如果在node环境下运行this为undefined;
  7. fn1();

  箭头函数里面的this不是调用箭头函数的this, 箭头函数虽然也有自己的作用域链, 但是箭头函数没有this, 箭头函数的this为:离箭头函数最近的一个通过function(){}创建的函数的this, 说不清的话, 看下Demo....

  1. (function fn(){
  2. let Fn = () => {
  3. this.x = ;
  4. this.y = ;
  5. return this;
  6. };
  7. //Fn = Fn.bind(new Object);
  8. console.log( Fn.call(new Object) ); //输出结果: { obj: 1, x: 0, y: 1 }
  9. }.bind({obj:}))();

  以上Demo能够说明, 箭头函数的作用域内的this和谁调用它没有关系

  当然, 箭头函数的this跟方法也没有关系;

  1. (function() {
  2. let obj = {
  3. method : () => {
  4. console.log(this);
  5. }
  6. };
  7. obj.method();
  8. }.bind("hehe"))()

    也正因为箭头函数的this和箭头函数一点关系都没有, 所以箭头函数不能作为构造函数

    箭头函数的内部无法获取到arguments;

    箭头函数不能作为Generator;

  ES7提供了一个很方便去绑定作用域的写法

  ES3和ES5和ES6, 绑定作用域都用bind, 或者call, 或者apply, 好家伙, 现在用 :: 两个冒号

  1. foo::bar;
  2. // 等同于
  3. bar.bind(foo);
  4.  
  5. const hasOwnProperty = Object.prototype.hasOwnProperty;
  6. function hasOwn(obj, key) {
  7. return obj::hasOwnProperty(key);
  8. };
  9. */
  10.  
  11. let query = document.querySelectorAll.bind(document)
  12. 等同于:
  13. 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

ES6新特性:Function函数扩展, 扩展到看不懂的更多相关文章

  1. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  2. ES6新特性箭头函数和常用function()对比

    // 无参 var fn1 = function() {} var fn1 = () => {} // 单个参数 var fn2 = function(a) {} var fn2 = a =&g ...

  3. javascript ES6 新特性之 扩展运算符 三个点 ...

    对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...

  4. ES6新特性三: Generator(生成器)函数详解

    本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...

  5. ES6新特性:Proxy代理器

    ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...

  6. 前端入门21-JavaScript的ES6新特性

    声明 本篇内容全部摘自阮一峰的:ECMAScript 6 入门 阮一峰的这本书,我个人觉得写得挺好的,不管是描述方面,还是例子,都讲得挺通俗易懂,每个新特性基本都还会跟 ES5 旧标准做比较,说明为什 ...

  7. 34.js----JS 开发者必须知道的十个 ES6 新特性

    JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> ...

  8. 前端学习笔记 --ES6新特性

    前言 这篇博客是我在b站进行学习es6课程时的笔记总结与补充. 此处贴出up主的教程视频地址:深入解读ES6系列(全18讲) 1.ES6学习之路 1.1 ES6新特性 1. 变量 2. 函数 3. 数 ...

  9. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  10. ES6新特性简介

    ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...

随机推荐

  1. Unity的DrawCall

    图形引擎渲染画面的过程 Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述: 1. 可见性测试 1. 引擎首先经过简单的可见性测试,确定摄像机可以看到的物体 2. 准备好物 ...

  2. [No000004]在WIN7/8任务栏创建快捷方式

    在XP时代,有一个快速启动栏,创建快捷方式只需要把快捷方式放在“%AppData%\Roaming\Microsoft\Internet Explorer\Quick Launch”文件夹下即可,如果 ...

  3. BZOJ 3309: DZY Loves Math

    3309: DZY Loves Math Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 761  Solved: 401[Submit][Status ...

  4. 初识html5 File API实现带有进度提示的文件上传

    Html5终于解决了上传文件的同时显示文件上传进度的老问题.现在大部分的网站用Flash去实现这一功能,还有一些网站继续采用Html <form>with enctype=multipar ...

  5. QuartzCore笔记

    Quartz Core 图层编程 一.添加 Quartz Core 框架 要使用 Quartz Core 框架,你需要将其添加到你的工程中 . 然后 #import <Quartz Core/Q ...

  6. 浅析MySQL数据碎片的产生(data free)

    浅析MySQL数据碎片的产生 2011-03-30 09:28 核子可乐译 51CTO 字号:T | T MySQL列表,包括MyISAM和InnoDB这两种最常见的类型,而根据经验来说,其碎片的产生 ...

  7. ORACLE对时间日期的处理(转)

    共三部分: 第一部分:oracle sql日期比较: http://www.cnblogs.com/sopost/archive/2011/12/03/2275078.html 第二部分:Oracle ...

  8. 彻底理解Toast原理和解决小米MIUI系统上没法弹Toast的问题

    1.Toast的基本使用 Toast在Android中属于系统消息通知,用来提示用户完成了什么操作.或者给用户一个必要的提醒.Toast的官方定义是这样的: A toast provides simp ...

  9. 项目分享一:在项目中使用 IScroll 所碰到的那些坑

    最近做了个 WEB APP 项目,用到了大名鼎鼎的 IScroll,滚动的效果的确很赞,但是坑也是特别多,下面总结一下,希望自后来者有帮助. 该项目现已开源在 github 上,https://git ...

  10. Ext.NET-布局篇

    概述 前一篇介绍了Ext.NET基础知识,并对Ext.NET布局进行了简要的说明,本文中我们用一个完整的示例代码来看看Ext.NET的布局. 示例代码下载地址>>>>> ...