ES6新特性:Function函数扩展, 扩展到看不懂

  本文所有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

时间: 2024-12-26 09:05:05

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

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

ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者false时,会直接取到后面的值,而不是传入的这个参数值. 那怎么解决呢?对于上图的代码,可以通过判断是否传入了num参数,没有就用默认值:   这种做法还是很麻烦的,而ES6则直接在参数定义里面设置函数参数的默认值,而且不用担心传入参数是0或者false会出错了: 2.箭头函数 箭头函数用 =>

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

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() 方法,我们先来看一下 Object.assign() 方法: Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.如下: const target = { a: 1, b: 2 }; const source = { b: 4, c: 5

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

本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变. ② 写法: function* f() {} ③ 作用:就是可以完全控制函数的内部状态的变化,依次遍历这些状态. ④ 运行过程:当调用Generator函数的时候,该函数并不执行,而是返回一个遍历器(可以理解成暂停执行).通过调用next()开始执行,遇到yield停止执行,返回一个value

ES6新特性:Proxy代理器

ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome>39或者firefox>18: Proxy的基本使用: Proxy如其名, 它的作用是在对象和和对象的属性值之间设置一个代理,获取该对象的值或者设置该对象的值, 以及实例化等等多种操作, 都会被拦截住, 经过这一层我们可以统一处理,我们可以认为它就是“代理器” ; Proxy是一个构造函数, 使

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

JS 开发者必须知道的十个 ES6 新特性 这是为忙碌的开发者准备的ES6中最棒的十个特性(无特定顺序): 默认参数 模版表达式 多行字符串 拆包表达式 改进的对象表达式 箭头函数 =&> Promise 块级作用域的let和const 类 模块化 注意:这个列表十分主观并且带有偏见,其他未上榜的特性并不是因为没有作用,我这么做只是单纯的希望将这份列表中的项目保持在十个. 首先,一个简单的JavaScript时间线,不了解历史的人也无法创造历史. 1995年:JavaScript以LiveS

ES6 新特性

ES6新特性 1.变量 (1).var 的问题:可以重复声明;  无法限制修改;  没有块级作用域; (2).新加let: 不能重复声明;  变量-可以重新进行赋值;  块级作用域; (3).新加const:不能重复声明;  常量-不可以重新进行赋值;  块级作用域; //var a=1; //var a=2; //alert(a); //可以重复声明 //let a=1; //let a=2; //alert(a);//不可以重复声明 const a=1; const a=2; alert(a

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

声明 本篇内容全部摘自阮一峰的:ECMAScript 6 入门 阮一峰的这本书,我个人觉得写得挺好的,不管是描述方面,还是例子,都讲得挺通俗易懂,每个新特性基本都还会跟 ES5 旧标准做比较,说明为什么会有这个新特性,这更于理解. 所以,后续不会再写个关于 ES6 系列的文章了,就在这篇里大概的列举一下,大体清楚都有哪些新特性就好了,以后需要用时再去翻一翻阮一峰的书. 正文-ES6新特性 ES6 新标准规范相比于 ES5 旧标准规范中,无非就三个方面的改动:新增.更新.废弃. 由于更新和废弃需要

H5,C3,ES6新特性

H5的新特性 1.语义化标签 有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重. 语义化的HTML在没有CSS的情况下也能呈现较好的内容结构与代码结构 方便其他设备的解析 便于团队开发和维护 2.表单新特性 3.多媒体视频(video)和音频(audio) 4.web存储 sessionstorage:关闭浏览器清空数据,储存大小约5M. localstorage:永久生效,存储大小20M,多窗口下都可以使用 都只能储存字符串 C3的新特性 1.选择器:

ES6新特性

ES6新特性概览 箭头操作符 如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs. 我们知道在JS中回调是经常的事,而一般回调又以匿名函数的形式出现,每次都需要写一个function,甚是繁琐.当引入箭头操作符后可以方便地写回调了.请看下面的例子. var array = [1, 2, 3]; //传统写法 array.forEach(f

ES6新特性学习

ES6是ECMAScript 6的缩写简称,2015 年 6 月,ECMAScript 6 正式通过,成为国际标准.ES6带来的新功能涵盖面很广,还有很多很便利的功能.下面来记一下我接触到的几个新特性. 1.模板字符串,用反单引号包起来,可以实现字符串回车换行,也可以在字符串里拼接变量,${变量},很方便使用. var name="fanfan"; var age="20"; console.log("Hello,My name is "+nam