ES6学习笔记(二)参数的默认值和rest参数

JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】 ES6对象与函数增强特性摘要(150字): ES6新增了增强对象字面量语法,包括属性/方法简写(同名属性可省略值,方法去掉function关键字)和动态计算属性名(用[]包裹表达式)。函数方面支持参数默认值(避免逻辑或||的缺陷)、剩余参数(...args收集多余参数)和展开运算符(...用于函数调用/数组构造/对象浅拷贝)。解构赋值可从数组/对象中提取值到变量,数组按位置解构,对象按属性名解构,均支持默认值和别名。这些特性提升了代码简洁性和表达力,其中展开运算符和解构赋值在数据处理中尤为实用。 阅读详情

ES6在函数参数上有了一些很方便的改变,其一就是参数的默认值可以在写形参的时候直接写

参数默认值的使用


参数的默认值是在参数被省略或者参数为undefined时使用。

function fn(a=1){
    console.log("a: "+a);
}

fn() // "a: 1"

fn(undefined) // "a: 1"

fn(2) // "a: 2"

这两种情况看起来似乎是相同的,但在某些情况还是有些区别的,比如传入undefined时arguments的length会增加,而省略不会。

function fn(a=1,b=2){
    console.log(arguments.length);
}

fn() // 0

fn(undefined) // 1

fn(undefined,undefined) // 2

参数默认值带来的便利


在ES5中,我们如果要实现参数的默认值,一般是会在函数的第一行用到"||"来给传入的参数赋默认值

function fn(a){
    a=a||'world';
    console.log('hello '+a);
}

fn();//hello world
fn('friend');//hello friend

当我们省略参数时,a就会自动赋值为'world',当传入参数时,a就会等于输入的参数。但是这个方法有一些缺陷,在传入可以隐式转为假值的值时就会调用默认值,如下面代码

function add(a,b){
    a=a||2;
    b=b||3;
    console.log(a+b);
}
add(); // 5
add(0); // 5
add(0,0); // 5

可以看到,虽然我们传入了0,但是因为这里将0隐式转为false,根据||的用法,如果||判断中第一个值为false,那么就会将||后的值作为这个运算的最后结果,所i有a||2,也就是0||2,最后返回的是2,所以这里即便传入了0,最后a还是等于2。b也同理。

除了使用"||"外,也可以使用arguments来获取参数,从而达到同样的效果。

function fn() {
    var a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'world';
    console.log('hello ' + a);
}

这里通过使用三目运算符判断是否有参数,若有的话将a赋值为传入的参数,没有的话则赋值为'world'。(这部分代码是我用下面要写的ES6在babel下转换生成的)

在ES6中,我们可以很方便地实现函数参数的默认值,形式几乎就是在参数位置直接赋值,很容易记住

function fn(a='world'){
    console.log('hello '+a);
}

fn();//hello world
fn('friend');//hello friend

像这样直接在参数位置赋给a默认值,十分方便。可能一个参数看起来和写一句var a=a||'world'差别不大,但是如果参数多的话,ES6提供的便利性就很明显了,而且这样也避免了一些使用||的坑。

参数默认值表达式


参数默认值不仅可以是一些简单值,也可以是一些合法的表达式,甚至是函数调用。

function fn(a=x+1,b=num()){
	console.log(a+b);
}
function num(){
    return 10;
}

var x=5;
fn(); // 16

var x=6;
fn(); // 17

上面对的代码使用的两个默认值,一个是相加的表达式,一个是函数调用。而从上面两个fn()打印出的结果不同可以看出,作为默认参数的表达式是惰性求值的,它们只在需要的时候运行。

还有一点要注意的是,参数默认值是在其自己的作用域中,即上面的代码中,a=x+1,首先是在a所在的作用域中寻找x,在当前作用域中找不到x后在外部作用域寻找x,找到后才赋值给这里的a,可以使用下面的代码更明显地看出参数默认值所在的作用域。

var z=2;
function fn(z=z){
    console.log(z);
}

fn(); // Uncaught ReferenceError: z is not defined at fn

这里在调用方法fn时,因为没有传入参数,所以要使用参数默认值,而首先在当前作用域中寻找z,而当前作用域中z是个未被初始化的参数变量,所以将z作为参数默认值会报错。

参数默认值带来的坑


ES6的默认参数虽然方便,但也有一些坑:

1.使用默认参数后不能再在函数里面使用let和const声明该变量,但是var可以

function fn(a=2){
    let a=1;
}

fn()//Uncaught SyntaxError: Identifier 'a' has already been declared
fn(1)//Uncaught SyntaxError: Identifier 'a' has already been declared

这个可以在阮一峰的ES6入门中得到解释,“参数变量是默认声明的”,所以let和const是不能再次使用的,这里的报错也可以看出'a'已经被声明了。

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

function fn(a,a,b){
    console.log(a+''+b);
}

fn(1,2,3,4);//34

function fn(a,a=2,b){
    console.log(a+''+b);
}//Uncaught SyntaxError: Duplicate parameter name not allowed in this context


function fn(a,a,b=2){
    console.log(a+''+b);
}//Uncaught SyntaxError: Duplicate parameter name not allowed in this context

这里可以看到在没给参数赋默认值之前,传入相同的参数名是不会报错的,也可以传入参数执行结果,但是如果给参数赋默认值的话,不管赋默认值的是重复的参数还是没重复的参数,都会报错。

3.函数的length值会失真

指定了函数的参数默认值后,函数的length值会返回没有指定默认值的参数个数

(function fn(a,b,c){}).length//3
(function fn(a,b,c=1){}).length//2
(function fn(a,b=1,c=1){}).length//1
(function fn(a=1,b,c){}).length//0   a后面的b,c不带默认值

就上面代码来看,第一行的代码的函数参数中没有默认参数,所以length值为3,第二,三行的代码中的length值等于参数个数减去带默认值的参数的个数。而第四行我们可以看到,只有一个带默认值的参数,但是得到的length值却为0,是因为带默认参数的值后面还有不带默认值的参数,所以就会使length的值为0。

说完这部分坑,说说ES6另一个便利的地方,rest参数

在ES6之前,我们如果不确定会传入多少个参数,可以使用arguments来获取多传入的参数

function fn(a){
    if(arguments.length>1)
        for(let i=0;i<arguments.length;i++)
        	console.log(arguments[i]);
    else
        console.log(a);
}

fn(1);//1

fn(1,2,3,4);//1 2 3 4

而在ES6中,我们可以这样写

function fn(a, ...rest) {
    console.log(a);
    for (let i = 0; i < rest.length; i++)
        console.log(rest[i]);
}

fn(1);//1

fn(1,2,3,4);//1 2 3 4

这样得到的rest为一个数组对象。同样的,在使用rest参数时,也有要注意的地方,rest参数必须放在参数最后面的地方,否则会报错

function fn(a, ...rest,b) {
    console.log(a);
    for (let i = 0; i < rest.length; i++)
        console.log(rest[i]);
}//Uncaught SyntaxError: Rest parameter must be last formal parameter

参考文档:阮一峰的《ECMAScript6入门》

                  Kyle Simpson的《你不知道的JavaScript 下卷》

 


ES6学习笔记目录(持续更新中)

 

ES6学习笔记(一)let和const

ES6学习笔记(二)参数的默认值和rest参数

ES6学习笔记(三)箭头函数简化数组函数的使用

ES6学习笔记(四)解构赋值

ES6学习笔记(五)Set结构和Map结构

ES6学习笔记(六)Iterator接口

ES6学习笔记(七)数组的扩展

ES6学习笔记(八)字符串的扩展

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

ES6学习笔记(十)对象的扩展

ES6学习笔记(十一)Symbol

ES6学习笔记(十二)Proxy代理

ES6学习笔记(十三)Reflect对象

ES6学习笔记(十四)Promise对象

ES6学习笔记(十五)Generator函数

ES6学习笔记(十六)asnyc函数

ES6学习笔记(十七)类class

ES6学习笔记(十八)尾调用优化

ES6学习笔记(十九)正则的扩展

ES6学习笔记(二十)ES Module的语法

 

 

7. ES6 函数参数的默认值 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。ES6 允许为函数的参数设置默认值,即直接写在参数定义的后面。另外,一个容易忽略的地方是,参数默认值不是传值的,而是每次都重新计算默认值表达式的值。也就是说,参数默认值是惰性求值的。 阅读详情

相关推荐

别再只当代码阅读器了!手把手教你用Understand的实体定位器和信息浏览器,5分钟精准定位代码逻辑

本文深入解析Understand代码分析工具的高级功能,重点介绍实体定位器和信息浏览器的实战应用。通过5分钟快速定位代码逻辑的技巧,帮助开发者从代码阅读者升级为逻辑侦探,提升大型代码库的分析效率。文章包含过滤搜索、调用链追踪等实用方法,是掌握Understand核心功能的必备指南。

weixin_28745821的博客 292

ES6 剩余参数

认识剩余参数 有这么一个需求,定义一个加法函数,用户传多少参数,就计算多少参数的总和。那么函数的形参要写几个呢?1个?2个?3个?显然都不合适,你怎么知道用户会传多少个数呢。由此引出了剩余参数的重要性。具体写法下面再举例,先让大家有个概念 剩余参数的本质 const add = (x, y, ...args) => { console.log(x, y, args); //注意这里使用的时候就不需要加“...”了,直接写参数名即可 }; add(); // undefined undefined [

不知名人士的博客 505

【遥感数字图像处理(朱文泉)】各章博文链接汇总及思维导图

遥感数字图像处理(北京师范大学朱文泉教授)课程各章博文笔记汇总,及各章节思维导图

甜子yu的博客 2623

JS: ...args,arguments,类数组转为真正的数组

...args,arguments,类数组转为真正的数组

weixin_43932309的博客 4154

超声波探伤技术在风电叶片检测中的实战应用(含设备选型指南)

本文深入探讨了超声波探伤技术在风电叶片高空检测中的实战应用,重点分析了相控阵超声、激光超声等技术的选择与挑战。文章提供了详细的设备选型指南,对比了奥林巴斯、GE及国产品牌的优劣,并解读了典型缺陷的超声图谱特征,旨在帮助风电运维工程师安全、高效地完成叶片内部损伤的无损检测与预防性维护。

desk3的博客 885

基于pytest+Allure+Python+CANoe的汽车诊断自动化测试框架搭建实战

自动化测试是提升软件质量和研发效率的关键技术,其核心原理是通过脚本模拟人工操作,实现测试用例的自动执行与结果验证。在汽车电子领域,诊断服务测试是确保车辆ECU(电子控制单元)功能正常的重要环节,传统手动测试在面对海量用例和频繁回归时效率低下。本文聚焦于如何利用Python的pytest测试框架、Allure报告工具以及Excel数据驱动,构建一个与Vector CANoe仿真测试环境深度集成的自动化测试解决方案。该方案通过Python调用CANoe的COM接口,实现了诊断报文的自动发送与响应验证,并结合Al

weixin_30384217的博客 678

ES6学习(五):函数参数的默认值、rest 参数、扩展运算符

ES6之函数参数的默认值、rest 参数、扩展运算符

激洪的博客 420

数字游民产业小报告 · 2025

2025 年全球数字游民约(不同统计口径差异很大,低估法约 4,000 万,高估法 8,000 万),美国来源占比最高。:2025 Q1 约岗位允许一定程度远程;2024 年美国员工至少部分远程(全球 2023 年约 28%)。:到 2025 年,提供数字游民/远程工作签证(媒体口径 50–73 个不等;福布斯 66、Citizen Remote 50+、有机构清单称 73)。:以英国为例,期望未来一年全勤到岗、企业因强制返岗出现离职,说明“灵活/远程”仍是劳动力市场的筹码之一。

Anthony1453的博客 1468

04-ES6语法:默认参数和rest参数

本文分别介绍ES6语法中的默认参数和rest参数,简单明了,详细的示例说明。

光脚丫思考的专栏 3万+

s8654

The official Snapdragon Ride SX 4.0 development board provides standardized hardware support for the secondary development and functional verification of the s8654 platform.

qq_39257814的博客 6830

YOLOv11改进策略【Neck】| ASF-YOLO 注意力尺度序列融合模块改进颈部网络,提高小目标检测精度

ASF-YOLO是一种基于YOLO的新颖框架,结合了空间和尺度特征以实现准确和快速的分割。其中,注意力尺度序列融合模块。

Limiiiing的博客 4391

【ES6+】004-ES6新特性:ES6中函数参数的默认值、rest参数、扩展运算符

目录 一、ES6中函数参数的默认值 1、概述 2、代码示例及相关说明 二、rest参数 1、概述 2、代码示例及相关说明 3、运行结果 三、扩展运算符 1、介绍 2、基本使用 3、运行结果 4、应用 5、运行结果 一、ES6中函数参数的默认值 1、概述 ES允许给函数的参数赋初始值; 2、代码示例及相关说明 <!DOCTYPE html> <html> <head> <meta charset="utf-8">.

訾博(ZiBo)的博客 316

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目,为远程直接内存访问(RDMA)提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具,旨在简化 RDMA 应用的开发和部署。

嵌入式技术开发 3896

【ES6丨前端进阶基础 】二,ES6rest参数,Symbol第七种数据类型

ES全称EcmaScript,是脚本语言的规范,而平时经常编写的JavaScript,是EcmaScript的一种实现,所以ES新特性其实指的就是JavaScript的新特性我是Aic山鱼​原 创 不 易 ✨还希望支持一下评论✍:您的建议是我改进的良药!山鱼社区💌💌。

zhaochen1127的博客 2699

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ES6的默认参数和rest参数

ES6的默认参数和rest参数为函数的定义和调用提供了更多的灵活性和简洁性。 - 默认参数可以为函数的参数提供默认值,避免因为缺少某些参数而导致错误; - rest参数可以接收任意数量的参数,并将它们封装成一个数组,使得处理不确定数量的参数更加方便。

俊刚的博客 1716

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ES6之rest参数、扩展运算符

rest参数与arguments变量相似。ES6引入rest参数代替arguments,获取函数实参。扩展运算符能将数组转化为参数序列。以上就是rest参数和扩展运算符的讲解。

qq_73918355的博客 1717

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ES6(六: 函数扩展)(默认值,rest参数,扩展运算符)

前言想必在ES6没出现类语法之前,js中最重要的类型就是函数。无可非议,这就是一个大重点。

JUSTIN的博客 3287

ES5与ES6之函数参数的默认值【拓展rest运算和rest的逆运算】

前言 1.介绍ES5与ES6传入默认参数的方式 2.介绍ES5与ES6怎么将多余的参数转换成数组的方式,即获取函数有几个参数和怎么处理参数 rest的运算 3.介绍ES5与ES6怎么将数组打散成参数的操作 一、ES5中函数参数默认值的做法 代码1: function fn(a, b, c){ b = b || 1; c = c || 2; return a + b +...

单车去旅行的博客 798

ES6 参数默认值、rest参数、...拓展运算符

本文主要讲三部分: default 参数默认值:(参数=“默认值”) ==> 作用:设置参数默认值 rest 参数:三个点+参数(/数组)名(...rest) ==> 作用:将同时传入的多个参数放入数组中 ... 拓展运算符:三个点 (...) ...

weixin_41796631的博客 428

ES6 函数的扩展:参数默认值,箭头函数,rest参数

参考资料:阮一峰老师的es6 参数默认值 ES6 之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 function log(x, y) { y = y || 'World'; console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', ''...

weixin_43026567的博客 427

ES6的函数rest参数用法

es6中引入了rest参数,样式形如...xxx,用于获取函数的多余参数,这样就不需要使用arguments对象了。rest参数搭配的一个变量是一个数组,该变量将多余的参数放入数组中。例如: function add(...value){ console.log(value); let sum=0; for(var val of value){ sum+...

一个兢兢业业的programmer 2364

es6函数的扩展

剩余语法(Rest syntax 也可以叫剩余参数)看起来和展开语法完全相同都是使用...的语法糖,不同之处在于剩余参数用于解构数组和对象。从某种意义上说,剩余语法与展开语法是相反的:展开语法将数组展开为其中的各个元素,而剩余语法则是将多个元素收集起来成为一个整体。在编程中使用最多的就是函数,在 ES5 中是用function关键字来定义函数的,由于历史原因function定义的函数存在一些问题,如this的指向、函数参数arguments等。ES6 规定了可以使用 “箭头”=>

热情、奔放、快乐编程! 1554

es6常用特性———函数扩展(rest参数)

1.参数默认值 在调用函数时,如果没有提供该参数,则使用默认值 。 在es5中给参数添加默认值如下: function show(a, b, c) { if (c === undefined) { c = 0; } console.log(a + b); } show(1, 2); //3 es6中为函数添加默认值如下: function show(a,...

weixin_45387568的博客 579

【ES6】对象方法简化写法、箭头函数、参数默认值、rest参数

文章目录简化对象和函数写法箭头函数参数默认值rest 参数 简化对象和函数写法 【介绍】 ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁 let name = "张三"; let talk = function () { console.log("你好,很高兴见到你"); } //创建对象 const person = { // 完整写法 // name:name, //

Errol's Blog 1029

ES6中rest参数

在ES6中引入了 rest 参数,它的形式是是(...变量名) 作用:用于获取函数的多余参数,这样就不用使用 arguments 对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。 例如: function add(...values){ let num = 0; for(let s of values){ num ...

zsl15039718107的博客 768

ES6-rest参数

文章目录rest参数一.rest参数二.扩展运算符三.扩展运算符的应用四.严格模式五.name属性参考文档 rest参数 一.rest参数 rest参数(形式为"…变量名"),用于获取函数的多余参数,这样就不需要使用arguments(参数)对象了. rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中. function add(...a){ let sum = 0; for(var val of a){ sum += val; } retur

杨欢博的博客 2288
上一篇: canvas+js绘制简单统计图(扇形图,条形图)
下一篇: ES6学习笔记(三)箭头函数
前端小黑
博客等级 码龄9年 148粉丝 222原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值