zoukankan      html  css  js  c++  java
  • ES6 函数参数的默认值

    基本用法

    在ES6之前,不能直接为函数的参数指定默认值,只能采取变通的方法。

    function log(x,y){
        y = y||'world';
        console.log(x,y);
    }
    log('kkk');//kkk world
    

    这种写法的缺点在于:
    如果参数y赋值了,但是对应的布尔值为false,则该赋值不起作用。如果在调用函数的时候,传入的y参数是一个空字符串,那么y就会被修改为默认值。
    避免这个问题,需要先判断一下:1.通过判断值是否等于undefined,2.判断arguments.length是否为1.

    但是ES6允许为函数的参数设置默认值,即直接写在参数定义的后面。

    function log(x,y='world'){
        console.log(x,y);
    }
    log('hello'); //hello world
    

    ES6语法的好处:
    1.简洁
    2.阅读代码的人可以看出哪些参数是可以省略的,不用查看函数体或文档
    3.有利于将来的代码优化,即使未来的版本即使拿掉这个参数,以前的代码也可以运行
    还有参数变量是默认声明的,不能在函数体内部再进行声明。

    与解构赋值默认值结合使用

    这里有两种写法需要区分一下:

    function m1({x=0,y=0} = {}){
        return [x,y];
    }
    function m2({x,y} = {x:0,y:0}){
        return [x,y];
    }
    m1({x:3});//[3,0]
    m2({x:3});//[3,undefined]
    m1({});//[0,0]
    m2({});//[undefined,undefined]
    

    参数默认值的位置

    通常情况下,定义了默认值的参数应该是函数的尾参数。因为这样比较容易看出,到底省略了哪些参数,如果非尾部的参数设置默认值,实际上这个参数是无法省略的。
    如果有默认值的参数都不是尾参数,这时,无法只省略该参数而不省略其后的参数,除非显示输入undefined。如果传入undefined,那么就会触发默认值,但是null没有这个效果。
    函数的length属性
    如果函数指定了默认值后,函数的length属性就不会包含有默认值的参数。这是因为length属性的含义是,该函数预期传入的参数个数,某个参数指定默认值之后,预期传入的参数个数就不包括
    这个参数了,同理,rest参数也不会计入length属性。
    函数参数默认值的类型
    (1)变量
    如果函数参数的默认值是一个变量,则该变量所处的作用域和其他变量的作用域规则相同,即是先前函数的作用域,然后再是全局作用域。
    (2)函数
    如果函数A的参数默认值是函数B,那么由于函数的作用域是其声明的时候所在的作用域,函数B的作用域就在全局作用域而不是函数A的作用域。

  • 相关阅读:
    Java-Class-@I:org.springframework.web.bind.annotation.RequestBody.java
    Java-Class-@I:org.springframework.validation.annotation.Validated.java
    Java-Class-@I:org.springframework.beans.factory.annotation.Autowired.java
    Java-Class-@I:org.springframework.stereotype.Service.java
    Murano环境搭建、使用介绍和思考
    简洁经常使用权限系统的设计与实现(一):构造权限菜单树的N(N>=4)种方法
    Android 依赖注入: Dagger 2 实例解说(一)
    mybatis的#和$的差别
    国内外优秀呼叫中心系统简单介绍
    openWRT学习之LUCI之中的一个helloworld演示样例
  • 原文地址:https://www.cnblogs.com/sminocence/p/8451270.html
Copyright © 2011-2022 走看看