• ES6---函数的扩展之函数的默认值


    1.函数默认值

    function add(a,b=3){
        return a+b;
    }
    add(1,2);//3
    add(1);//4
    

    理解起来也很简单,就是在函数定义的时候设置一个默认值,当调用函数没有传参时,可以根据默认值为其匹配一个参数值

    这样子的好处嘛,可以避免在调用时没有传参导致函数报错,同时对于阅读代码也更加直观了,代码量也更少了,嘻嘻

    • 直观是因为我们只需要看函数就知道该参数是否可选
    • 代码更少是因为在ES6以前,函数不能设置默认值,如果在调用的时候没有传参进去,

       那么需要进行是否传递该参数进来,没有的话就取一个默认值才能达到实现的效果

    function add(a,b){
    if(b==undefined){
      b=3;
    }
      return a+b;
    }
    add(1);//4
    add(1,2);//3

     但记得注意一下几点:

    1.若使用了函数默认值,则函数所有参数等同于在函数内默认声明过了,所以不能使用let和const定义同名参数

    //函数会报错
    function add(a,b=3){   const a = 1;
      let b = 2;   return a+b; }

     记得var定义同名参数是可以的,这是由于var是定义的全局变量,懂函数作用域链的应该都挺容易理解的

    2.若使用函数默认值,则参数不能出现同名参数(ES6以前同名函数是允许的,因为只需要考虑调用时参数传递顺序即可)

    //这种不报错
    function add(a,a,b){
     . . .   
    }
    
    //报错了
    function add(a,a,b=3){
    . . .
    }
    

     3.函数默认值是惰性求值的,他不是直接传参数值进去的,而是当调用时没有参数时计算默认值再赋值给,所以参数的默认值可以是一个表达式

    let x = 100
    function add(a,b=x+1){
      return a+b;
    }
    add(1);//101
    add(1,2);//3

     4.关于函数默认值的位置(你品你细品),你就会发现,上边例子中完全没有在第一个参数写上默认值(实际上只是偷懒只写一个例子┗( ▔, ▔ )┛)

     如果默认值,设置在参数a的话,那么可以在调用时是可以不传第一个参数吗?

    答案是:No!一般函数默认值写在最后一个参数或者下一个参数仍设置默认值(直接所有参数都写了默认值就不用考虑,哈哈),对于那种跳过式的如

    function(a=3,b){} ; function(a,b=3,c){}

    像上述情况,默认值前面的参数,调用时不能直接省略掉,因为函数参数读取是按顺序的(#皿#)  

    所以遇到这种情况,请放弃这种写法(开玩笑的啦,哈哈!!!∑(゚Д゚ノ)ノ)

    在调用的时候使用undefined(不能使用null,null代表传进去参数的值为null),代表该参数不传参进去,就会使用默认值了

    function add(a=3,b){
        return a+b;
    }
     add(1);//NaN,此时b为undefined,所以相加为NaN
    add(,1);//报错
    add(undefined,1)://4,正确操作
    add(null,1);//1,a就为空值,就是0了呗
    

    函数的length属性

    一个用来显示函数中没有设置函数默认值的参数个数,很好理解,

    例如

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

     看了上面的例子是不是都明白了呀,嘻嘻

    但是有一个需要的点,那就是当函数默认值设置在参数中间的时候,length只会统计到第一个默认值前面没有设置默认值的参数的个数

    (function(a,b=1){. . . }).length;//1
    (function(a=1,b){. . . }).length;//0
    (function(a,b=1,c,d=1){. . . }).length;//1
    
  • 相关阅读:
    使用XE7并行库中的TTask(转)
    Delphi xe7并行编程快速入门(转)
    Pre-compile (pre-JIT) your assembly on the fly, or trigger JIT compilation ahead-of-time (转)
    使用RemObjects Pascal Script (转)
    Remobjects SDK 服务器搭建
    toString()方法
    环境变量
    jstl标签学习
    SQL的各种join
    Mybatis的一些配置
  • 原文地址:https://www.cnblogs.com/kongbaifeiye/p/12601778.html
Copyright © 2020-2023  润新知