1、函数参数的默认值

(1)基本用法

ES5 中, 不能直接为函数的参数指定默认值。只能采用变通的方法。

function log(x, y) {
y = y || 'World';
console.log(x, y);
} log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World (错误)

以上方法虽然可行,但是存在着一定的缺点: 如果参数y 赋了boolean值为false的值,那么该赋值不起作用。

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

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

除了简洁,ES6 的写法还有两个好处:

  1、阅读代码的人, 可以立即看到哪些参数是可以省略的;

  2、有利于将来的代码优化; (即使未来的版本在对外接口中,彻底拿掉这个参数,也不会导致以前的代码无法运行。)

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

function foo(x = 5) {
let x = 1; // error
const x = 2; // error
}

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

// 不报错
function foo(x, x, y) {
// ...
} // 报错
function foo(x, x, y = 1) { //有默认值时,不能有同名参数
// ...
}

参数默认值是惰性求值的;每次调用都会重新计算表达式的值。

let x = 99;
function foo(p = x + 1) {
console.log(p);
} foo() // x = 100;
foo() //

(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

---恢复内容结束---

ES6标准入门 第五章:函数的扩展的更多相关文章

  1. ES6标准入门 第五章:数值的扩展

    1.二进制和八进制数值表示法 二进制前缀:0b(或0B):   八进制前缀:0o(或0O). 注意:ES5的严格模式 和 ES6中不再允许使用 0  表示八进制. 将二进制和八进制数值转换为十进制数值 ...

  2. ES6标准入门 第五章:正则的扩展

    1.RegExp 构造函数 ES5的缺陷: ES5中构造函数的参数有两种情况: (1)参数是字符串,这时第二个参数表示正则表达式的的修饰符(flag). var reg = new RegExp( & ...

  3. ES6学习笔记(五)函数的扩展

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

  4. ES6标准入门 第三章:变量的解构赋值

    解构赋值:从数组和对象中提取值,对变量进行赋值. 本质上,这种写法属于“匹配模式”:只要等号两边的模式相同,左边的变量就会被赋予对应的值. 1.数组的结解构赋值 基本用法 let [foo, [[ba ...

  5. ES6标准入门 第四章:字符串的扩展

    1.字符串的Unicode 表示法 JavaScript 允许采用 \uxxxx 表示一个字符,其中 xxxx 表示字符的码点. "\u0061" // "a" ...

  6. 《ES6标准入门》(阮一峰)--8.函数的扩展

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

  7. ES6快速入门(一)函数与作用域

    ES6快速入门 一.块级绑定 1.var声明与变量提升 使用var声明的变量,不论在何处都会被视为(声明)在函数级作用域顶部的位置发生. function getValue(condition) { ...

  8. ES6标准入门之变量的解构赋值简单解说

    首先我们来看一看解构的概念,在ES6标准下,允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称作解构,简而言之粗糙的理解就是变相赋值. 解构赋值的规则是,只要等号右边的值不是对象或者数组 ...

  9. [转] 《ES6标准入门》读书笔记

    来源:https://segmentfault.com/a/1190000005863641 let和const命令 ES6新增let命令,用于声明变量,是块级作用域. let声明的变量不会像var声 ...

随机推荐

  1. 一、模型验证CoreWebApi 管道方式(非过滤器处理)2(IApplicationBuilder扩展方法的另一种写法)

    一. 自定义中间件类的方式用一个单独类文件进行验证处理 Configure下添加配置 //app.AddAuthorize(); AddAuthorize因为参数(this IApplicationB ...

  2. Librepilot-Spark2固件的烧写

    1.通过USB连接Librepilot_Spark2飞控,启动Librepilot GCS地面站(博主的GCS是16.09版本),界面如下. 2.点击Firmware标签页,点击终止系统(若板子未带系 ...

  3. Spring注解配置、Spring aop、整合Junit——Spring学习 day2

    注解配置: 1.为主配置文件引入新的命名空间(约束) preference中引入文件 2.开启使用注解代理配置文件 <?xml version="1.0" encoding= ...

  4. (转) weblogic 域,管理服务器,受管服务器,集群和机器的基本知识

    weblogic 域,管理服务器,受管服务器,集群和机器的基本知识 1.域(Domain) •它是什么? –是一个逻辑上管理的WebLogic Server组,这些组从管理上当作一个整体来操作 •域里 ...

  5. zencart后台订单详细页显示产品图片和链接

    方法一: 找到admin/order.php 大约491行 for ($i=0, $n=sizeof($order->products); $i<$n; $i++) { 与 if (iss ...

  6. ssh 密码连接报错 permission denied

    背景:ssh连接openstack  king时,出错permission denied (publickey,gssapi-keyex,gssapi-with-mic) 原因:king未开启ssh ...

  7. aspnet:MaxHttpCollectionKeys 不起作用

    场景: vs2010  webform  表单域长度,在webconfig中加入该节点,有的项目起作用,有的项目无效,不知道是什么原因??

  8. 【Leetcode】整数反转

    题解参考:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/ 复杂度分 ...

  9. 当在本地磁盘服务(Windows)中无法删除指定分区时的解决方案

    有时候,我们在使用Windows管理磁盘分区时,可能会出现部分分区无法删除的情况,也就是说右键快捷菜单中没有删除卷的操作项. 此时,我们可以按照如下的步骤进行操作即可完成: Step 1: 以管理员身 ...

  10. Win7,win10(部分机型) 安装appscan9.0.3.10(可升级)实操流程

    Win10部分机型不能很好的兼容appscan,建议使用者用win7系统安装appscan 写于:2018.12.2 IBM Security AppScan Standard 可通过自动执行应用安全 ...