ES6入门(5)函数的扩展

2019/03/04 11:14 上午 posted in  ES6

ES6中函数的扩展

函数参数

// 参数默认值
    function fn(x="matrix", y="ES6") {
        console.log(x,y)
    }
    fn(0);

    // 参数使用结构赋值
    function fn1({name="matrix",age=100}={}) {
        console.log(name,age)
    }
    fn1();
    function fn1({name,age}={name:"matrix",age:100}) {
        console.log(name,age)
    }
    fn1();


    // length 属性,当前形参的个数,如果形参有默认值的情况length就是失真, length 是没有默认值的个数
    function fn2(x,y) {

    }
    fn2(1,2);
    console.log(fn2.length);
    
    
    // 参数默认值的位置:一般参数的默认值放在最后面
    function fn3(x=10, y=20) {
        
    }
    // fn3(,1) 会报错

    // arguments 类数组
    function fn4(...arg) {
        console.log(arguments);
        console.log(arg);
    }
    fn4(1,2,3,4,5);

    // 参数作用域的问题
    // 函数执行时候先给形参赋值,形参也是私有变量,如果给形参的默认值是 一个变量,先看是不是自己的私有变量,不是自己的在找全局中是否有这个变量,没有就报错
    // let x=10, y=100;
    // function fn5(x=x,y=y) {
    //     console.log(x);
    //     console.log(y);
    //     let x="matrix";
    //     let y="ES6";
    // }
    // fn5(1); //Identifier 'x' has already been declared

    let m=10, n=100;
    function fn5(x=m,y=n) {
        // 私有作用域:私有变量x,y,m,n
        console.log(x);
        console.log(y);
        let m="matrix";
        let n="ES6";
    }
    fn5(1); // 1 100

    let x=100;
    function fn6(x, y = x) {
        // x=1,y=x=1
        console.log(y);
    }
    fn6(1);

函数name问题

    function fn() {}
    console.log(fn.name); // fn
    console.log((function () {}).name); //  ""

    // 特殊情况
    // 1.通过bind方法得到一个新的额函数 name是 “bound 原来函数的名字”
    let fn1 = fn.bind(null);
    console.log(fn1.name);// bound fn

    // 2.通过构造函数创建一个函数 名字都叫做 "anonymous"

    // new Function("形参","函数体");
    // new Function("函数体");
    // function fn(形参) {函数体}
    let fn2 = new Function("x,y","console.log(x,y); return x+y");
    console.log(fn2(10,100));
    console.log(fn2.name); // anonymous

    // 面试题
    let str = '[{"name":"matrix"},{"age":100}]';
    // let arr = (new Function())();
    // 需要最后arr =>[{"name":"matrix"},{"age":100}]

    let arr = (new Function("return "+str))();
    console.log(arr);

扩展运算符

    // 扩展数组运算符 ...
    // 将非数组编程数组

    let str = "123";
    console.log([...str]);
    function fn() {
        console.log(...arguments);
    }
    fn(1,23,445);

    // 合并数组
    let arr1 = [1,2,3,4];
    let arr2 = [10,20,30,40];
    console.log(arr1.concat(arr2));
    console.log([...arr1, ...arr2]);

    // 求数组的最大值
    let ary = [10,20,30,40,1221];
    console.log(Math.max.apply(null, ary));
    console.log(Math.max(...ary));

箭头函数

箭头函数是匿名函数

    // let fn=(形参)=>{函数体}

    // 形参只有一个时候 可以省略()
    // 函数体只有一行代码 return  可以省略{}和return
    let fn = x => x+1;
    // let fn = x => {return x+1;};
    // 通常函数当做参数的时候使用箭头函数
    let ary = ["matrix",1,2,3];
    console.log(ary.filter(item => typeof item == "number")); // [1, 2, 3]
    // 注意箭头函数的几个特点
    // 1.箭头函数没有this指向,里面的this是上一级作用域下的this
    // 2.箭头函数没有arguments

    let f1=(...arg)=>{
        // console.log(arguments); // arguments is not defined
        console.log(arg); // [1, 2, 3, 4]
    };
    f1(1,2,3,4);

    // 3.箭头函数不可以用作构造函数 因为不可以使用new执行
    function FF() {}
    new FF;
    let F=()=>{};
    console.log(new F); //  F is not a constructor