美文网首页
ES6学习笔记(九):函数的扩展

ES6学习笔记(九):函数的扩展

作者: 大青呐 | 来源:发表于2017-07-08 11:50 被阅读0次

    1、函数的默认值

    从ES6开始,允许为函数参数设置默认值,即直接写在参数定义后面。

    function log(x, y = 'ES6') {
      console.log(x, y);
    }
    
    log('Hello') // Hello ES6
    log('Hello', 'Word') // Hello China
    log('Hello', ' ') // Hello
    

    参数变量是默认声明的,因此不能再使用let和const命令再次声明,否则会报错。

    function foo(a=1){
    let a=2;  //error
    const a=4;  //error
    }
    

    2、与解构赋值结合使用

    参数默认值可以与解构赋值的默认值结合起来使用。

    function foo({x, y = 5}) {
      console.log(x, y);
    }
    
    foo({}) // undefined, 5
    foo({x: 1}) // 1, 5
    foo({x: 1, y: 2}) // 1, 2
    foo() // TypeError: Cannot read property 'x' of undefined
    

    只有当函数foo对象时,变量x和y才会通过解构赋值而生成,如果函数foo调用的参数不是对象,变量x,y不会生成,就会报错。如果参数对象没有y值,y的默认值会生效。

    3、length属性

    指定默认值以后,函数的length属性返回的是没有指定默认值参数的个数,因为Length属性的含义就是函数预期传入参数的个数,当某个参数指定了默认值以后,预期的传入参数就不再包括已经指定的默认参数。

    (function (a) {}).length   // 1
    (function (a = 0) {}).length   // 0
    (function (a, b, c = 1,d=2) {}).length   // 2
    

    rest参数也是一样,不会计入length属性

    (function(...args) {}).length   // 0
    

    另外,如果设置了默认值的参数不是尾参数,那么length属性也不再计入后面的参数了。

    (function (a = 0, b, c,d) {}).length // 0
    (function (a, b = 1, c,d) {}).length // 1
    

    4、name属性

    函数的name属性,返回该函数的函数名。

    function foo(){}
    foo.name   // "foo"
    

    这个属性早就被浏览器广泛支持,但是直到ES6,才将其写入了标准。
    需要注意的是ES6对这个属性的行为做出了一些修改。如果将一个匿名函数赋值给一个变量。ES5的name属性,会返回空字符串,而ES6的name属性会返回实际的函数名。

    var func= function () {};
     // ES5
    func.name   // ""
    // ES6
    func.name   // "func"
    

    如果将一个具名函数赋值给一个常量,则ES5和ES6的name属性都返回这个具名函数原本的名字。

    const bar = function baz() {};  
    // ES5  
    bar.name // "baz"  
    // ES6  
    bar.name // "baz"  
    

    相关文章

      网友评论

          本文标题:ES6学习笔记(九):函数的扩展

          本文链接:https://www.haomeiwen.com/subject/euiccxtx.html