ES6 之前,不能直接为函数的参数指定默认值,ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。

function fun(x = 'Hello'){console.log(x);
}
fun();          //Hello
fun('Hi')     //Hi

参数变量是默认声明的,所以不能用letconst再次声明。

function fun(x = 0){let x = 1;             //报错const x = 1;           //报错
}

使用参数默认值时,函数不能有同名参数。

//不报错
function fun1(x , x , y){...
}//报错
function fun2(x , x , y = 0){...
}

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

function fun({x = 0 , y}){console.log(x , y);
}
fun({});                //0,undefined
fun({y: 1});            //0,1
fun({x: 2, y: 1});      //2,1
fun();                  //报错

上面代码只使用了对象的解构赋值默认值,没有使用函数参数的默认值。只有当函数foo的参数是一个对象时,变量xy才会通过解构赋值生成。如果函数foo调用时没提供参数,变量xy就不会生成,从而报错。通过提供函数参数的默认值,就可以避免这种情况。

function fun({x = 0 , y} = {}){console.log(x , y);
}
fun();                  //0,undefined

通常情况下,定义了默认值的参数,应该是函数的尾参数。因为这样比较容易看出来,到底省略了哪些参数。如果非尾部的参数设置默认值,实际上这个参数是没法省略的。

// 例一
function f(x = 1, y) {return [x, y];
}f()                // [1, undefined]
f(2)                // [2, undefined]
f(, 1)              // 报错
f(undefined, 1)     // [1, 1]

上面代码中,有默认值的参数都不是尾参数。这时,无法只省略该参数,而不省略它后面的参数,除非显式输入undefined
如果传入undefined,将触发该参数等于默认值,null则没有这个效果。

指定了默认值以后,函数的length属性,将返回没有指定默认值的参数个数。也就是说,指定了默认值后,length属性将失真。

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

这是因为length属性的含义是,该函数预期传入的参数个数。某个参数指定默认值以后,预期传入的参数个数就不包括这个参数了。同理,后文的 rest 参数也不会计入length属性。

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

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

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

一旦设置了参数的默认值,函数进行声明初始化时,参数会形成一个单独的作用域(context)。等到初始化结束,这个作用域就会消失。这种语法行为,在不设置参数默认值时,是不会出现的。

var x = 1;function f(x, y = x) {console.log(y);
}f(2);      // 2

上面代码中,参数y的默认值等于变量x。调用函数f时,参数形成一个单独的作用域。在这个作用域里面,默认值变量x指向第一个参数x,而不是全局变量x,所以输出是2。

let x = 1;function f(y = x) {let x = 2;console.log(y);
}f();       // 1

上面代码中,函数f调用时,参数y = x形成一个单独的作用域。这个作用域里面,变量x本身没有定义,所以指向外层的全局变量x。函数调用时,函数体内部的局部变量x影响不到默认值变量x

如果此时,全局变量x不存在,就会报错。

function f(y = x) {let x = 2;console.log(y);
}f();        // ReferenceError: x is not defined

下面这样写,也会报错。

var x = 1;function foo(x = x) {// ...
}foo();     // ReferenceError: x is not defined

上面代码中,参数x = x形成一个单独作用域。实际执行的是let x = x,由于暂时性死区的原因,这行代码会报错“ x 未定义 ”。

如果参数的默认值是一个函数,该函数的作用域也遵守这个规则。请看下面的例子。

let foo = 'outer';function bar(func = () => foo) {let foo = 'inner';console.log(func());
}bar(); // outer

上面代码中,函数bar的参数func的默认值是一个匿名函数,返回值为变量foo。函数参数形成的单独作用域里面,并没有定义变量foo,所以foo指向外层的全局变量foo,因此输出outer
如果写成下面这样,就会报错。

function bar(func = () => foo) {let foo = 'inner';console.log(func());
}bar() // ReferenceError: foo is not defined

ES6——函数参数默认值相关推荐

  1. ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map

    根据视频进行整理 [https://www.bilibili.com/video/BV1uK411H7on?p=1] 视频资源(百度网盘): 链接:[https://pan.baidu.com/s/1 ...

  2. C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)

    每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...

  3. C++之函数参数默认值

    C++之函数参数默认值 1.参数默认值的指定方式 在 C++ 中,可以在函数声明时为参数提供一个默认值.这样在函数调用时,如果没有提供函数参数值,则使用默认值. e.g. 在函数声明时,指定参数默认值 ...

  4. c++函数参数默认值设置

    c++函数参数默认值设置 1,函数参数默认值在函数声明的参数列表上定义,函数定义不变: #include <iostream>using namespace std; int add(in ...

  5. ES6新特性之函数优化-参数默认值

    函数优化 在ES6中,对函数的操作做了优化,使得我们在操作函数时更加的便捷. 函数参数默认值 在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法: function add(a , b) ...

  6. JavaScript中实现函数重载和参数默认值

    2019独角兽企业重金招聘Python工程师标准>>> 参数默认值是指在调用函数时,若省略了某个实参,函数会自动为该参数分配一个默认值,使得函数调用的方便性和灵活性大大提高. 举个例 ...

  7. php函数的默认值,php函数指定默认值方法的小例子

    php函数指定默认值方法的小例子 本节内容: php函数指定默认值 在php编程中,为自定义函数设定默认值,当用户调用该函数时,如果不给参数指定值,参数会用默认值顶替. 例1, 复制代码 代码如下: ...

  8. ES6函数参数的默认值

    基本用法 在ES6之前,不能直接将函数的参数指定默认值,只能采用变通的方法 function fn(x,y) {y = y || 'World'console.log(x,y) }fn('Hello' ...

  9. ES6函数参数的解构赋值,以及2种设置参数默认值方法的区别

    文章目录 1. 函数参数的解构赋值方式 2. 函数参数解构设置参数默认值 1. 方法1 2. 方法2 3. 总结 1. 函数参数的解构赋值方式 下面代码中,函数add的参数表面上是一个数组,但在传入参 ...

最新文章

  1. python更改使用国内镜像源安装、更新模块
  2. iOS 获取键盘相关信息
  3. ASP.NET Excel导入到SQL Server数据库
  4. 从零开始入门 K8s| K8s 的应用编排与管理
  5. java生成数据插入hbase_hbase实战之javaAPI插入数据
  6. 中怎样载入选区_ps中快捷大全
  7. 网站服务器时间秒杀,Javascript实现商品秒杀倒计时(时间与服务器时间同步)...
  8. gps卫星位置计算程序matlab_科研项目 | BD/ GPS卫星导航仿真测试系统研究
  9. Scrapy 爬虫框架初体验二 —— 以一个新闻站点爬取为例
  10. CC攻击(N个免费代理形成的DDOS)
  11. Python爬虫(二十一)_Selenium与PhantomJS
  12. 使用.NET 5自动查找代码中的潜在错误
  13. lambdapython语法_Python中lambda表达式的语法与应用
  14. JMP软件在六西格玛项目管理中高阶应用(五)
  15. webofscience入口注册_Web Of Science数据库免费检索入口,SCI论文期刊数据库免费入口...
  16. EDGE网络已落户嘉兴
  17. vue用html方式路由守卫,vue-router 实现导航守卫(路由卫士)的实例代码
  18. 标注 画框 转写,亲亲,你做错了没?
  19. 此mac已与apple id关联(如何绕过macOS恢复模式的激活锁)
  20. LC滤波器的截止频率公式

热门文章

  1. android-清单小文件
  2. 解决 Linux 下 Sublime Text 中文输入
  3. Thinkpad SL400安装黑苹果10.8.4全纪录
  4. c#.net操作注册表RegistryKey
  5. PropertyGrid 绑定动态的属性与值的集合
  6. 做你最后的Administrator
  7. 终于解决了无运行无网上邻居的问题
  8. Win-MASM64汇编语言-LEA指令
  9. python电子病历交接班系统_专科电子病历
  10. 常用通信时序之UART、IIC、SPI(基于STM32)