JavaScript全解析——ES6函数中参数的默认值和解构赋值

本文为千锋资深前端教学老师带来的【JavaScript全解析】系列,文章内含丰富的代码案例及配图,从0到1讲解JavaScript相关知识点,致力于教会每一个人学会JS!

文末有本文重点总结,可以收藏慢慢看~ 更多技术类内容,主页关注一波!

ES6函数中参数的默认值

给函数的形参设置一个默认值, 当你没有传递实参的时候, 使用默认值

直接使用 赋值符号(=) 给形参赋值即可

function fn(a, b = 100) { 
   console.log(a, b)
 } 
 
 fn() 
 fn(10) 
 fn(10, 20)

ES6的函数默认值

在ES5之前是没有函数默认值的。函数的默认值是ES6的新语法

函数的默认值是给函数的形参设置一个默认值, 当你没有传递实参的时候来使用

书写: 直接在书写形参的时候, 以赋值符号(=) 给形参设置默认值就可以了

任何函数都可以使用

注意: 如果你给箭头函数设置参数默认值, 那么不管多少个形参, 都得写小括号

普通函数

<script>
    // 给形参 a 设置了默认值为 10
    // 给形参 b 设置了默认值为 20
    function fn(a = 10, b = 20) {
        console.log('fn 普通函数内的打印')
        console.log('a : ', a)
        console.log('b : ', b)
    }
    // // 第一次调用
    // // 给 两个形参 赋值了, 那么就不使用默认值了
    fn(100, 200)
    // // 第二次调用
    // // 没有给 b 赋值, 那么 b 就会使用 20 这个默认值
    fn(1000)
    // // 第三次调用
    // // a 和 b 都没有实参进行赋值, 都会使用 默认值
    fn()
</script>
<script>
    //给a设置了默认值,b 没有设置默认值
    function fn(a = 10, b) {
        console.log('fn 普通函数内的打印')
        console.log('a : ', a)
        console.log('b : ', b)
    }
    //调用函数都不传递实参
    fn()
</script>

箭头函数

<script>
    // 箭头函数也可以设置默认值
    // 给形参 a 设置了默认值为 10
    // 给形参 b 设置了默认值为 20
    const fn = (a = 10, b = 20) => {
        console.log('fn 箭头函数内的打印')
        console.log('a : ', a)
        console.log('b : ', b)
        console.log('---------------------')
    }
    // // 第一次调用
    // // 给 两个形参 赋值了, 那么就不使用默认值了
    fn(100, 200)
    // // 第二次调用
    // // 没有给 b 赋值, 那么 b 就会使用 20 这个默认值
    fn(1000)
    // // 第三次调用
    // // a 和 b 都没有实参进行赋值, 都会使用 默认值
    fn()
</script>

随机数案例

<script>
    // 范围内的随机数
    // 定义函数, 两个数字分别默认值设置成 0 和 255
    const randomNum = (a = 255, b = 0) => Math.floor(Math.random() * (Math.abs(a - b) + 1)) + Math.min(a, b)
    console.log(randomNum(20, 30))
</script>

ES6解构赋值

ES6允许按照一定的模式,从数组或对象中提取值,给变量进行赋值,称为解构赋值。

解构赋值分为数组解构对象解构

数组解构

快速的从数组拿到数组中的数据

语法:var [变量1,变量2, 变量3,....] = 数组

会按照数组的索引依次把数组中的数据拿出来,赋值给对应的变量

<script>
    //定义一个数组
    const arr = [100, 200, 300, 400, 500]
        //需求: 单独定义五个变量获取五个数据
    const a = arr[0]
    const b = arr[1]
    const c = arr[2]
    const d = arr[3]
    const e = arr[4]
    console.log(a, b, c, d, e); //100 200 300 400 500
</script>
<script>
    // 解构数组
    const arr = [100, 200, 300, 400, 500]
    //需求: 单独定义五个变量获取五个数据
    const [a, b, c, d, e] = arr
    console.log(a, b, c, d, e) // 100 200 300 400 500
</script>

解构多维数组

数组怎么写, 解构怎么写,把数据换成变量

<script>
    // 1-2. 解构多维数组
    const arr = [1, 2, [3, 4, [5, 6, [7, 8, [9]]]]]
    console.log(arr)
    //需求: 定义变量拿到数据 9
    const a = arr[2][2][2][2][0]
    console.log(a) //9
    //解构
    const [a,b, [c, d, [e, f, [g, h, [i]]]]] = arr
    console.log(i) //9
</script>

对象解构

对象结构就是快速从对象中拿到对象中的数据

语法:var {键名1, 键名2, 键名3, ... } = 对象

按照键名, 依次定义变量从对象中获取指定成员

之前获取对象里面的值

<script>
    // 解构对象
    const obj = {
        name: 'Jack',
        age: 18,
        gender: '男'
    }
    const name = obj.name
    const age = obj.age
    const gender = obj.gender
    console.log(name, age, gender) //Jack 18 男
 </script>

解构获取对象里面的值

<script>
        // 解构对象
        const obj = {
            name: 'Jack',
            age: 18,
            gender: '男'
        }

        // 解构
        const {
            name,
            age,
            gender
        } = obj
        console.log(name, age, gender) //Jack 18 男
</script>

解构的时候可以给变量起一个别名

语法:var { 键名: 别名, 键名2: 别名 } = 对象

注意: 当你起了别名以后, 原先的键名不能在当做变量名使用了, 需要使用这个别名

<script>
    // 解构对象
    const obj = {
        name: 'Jack',
        age: 18,
        gender: '男'
    }
    //  解构的时候起一个别名
    const {
        name: a
    } = obj //等价于 const a = obj.name
    console.log(name, a); //Jake
    //注意name是一个特殊的属性,对象里面自带有改属性所以不会报错
    const {
        age: b
    } = obj //等价一const b = obj.age
    //console.log(age, b); //Uncaught ReferenceError: age is not 
    console.log(b); //18
</script>
<script>
    // 解构对象
    const obj = {
        name: 'Jack',
        age: 18,
        gender: '男'
    }
    const {
        name: a,
        gender,
        age: b
    } = obj
    console.log(a, b, gender) //Jack 18 男
</script>

以上就是我们这篇的全部内容啦!更多技术类干货,戳我主页

视频教程速戳:免费视频教程

本文转载于网络 如有侵权请联系删除

相关文章

  • flask教程之路由及模块化

    flask教程之路由及模块化一、基础路由@app.route("/guest/index") defindex(): return"index" #/guest/save?id=123 @app.route("/guest/save",methods=["POST","GET"]) defsave(): return"save"复制二、Blueprint模块化文件:guest.py在一个项目中通常会有很多路由地址,如果我们都配置在一个文件会显得很乱,所以我们会按功能模块来划分。这时候我们可以使用Blueprint来模块化。fromflaskimportBlueprint guest=Blueprint('guest',__name__) @guest.route("/guest/index") defindex(): return"index" @guest.route("/guest/save&q

  • [Go]go语言中的零值

    go语言中的零值是变量没有做初始化时系统默认设置的值varbbool//bool型零值是false varsstring//string的零值是""以下六种类型零值常量都是nil vara*int vara[]int varamap[string]int varachanint varafunc(string)int varaerror//error是接口 所有其他数值型的类型(包括complex64/128)零值都是0,可以用常量表达式代表数值0的任何形式表示出来。对于以上各种类型都可以通过==条件判断是不是零值.1.string的零值是"",也可以用len(x)==0来判断零值字符串。但是用""更好一点,把len(x)==0留给slice用。 2.数组和结构类似,有零值,但是没有相应的零值常量。 3.slice是个系统定义的结构,有三个字段:一个指针指到数据存储区,长度,存储区容量。只有三个字段都是零值的时候,这个变量才是零值。比如make([]int,0,0)创建的slice长度和容量都是0,但是指针不为空,所以不是零值

  • 初窥 Kotlin 1.2 的跨平台特性

    1.Kotlin怎么跨平台?Kotlin1.2的发布,带来了一个重量级特性,那就是跨平台。尽管跨平台特性目前只支持Jvm和JavaScript,但随着Native的快速迭代,相信在不久的将来,Kotlin的跨平台特性将会很快支持全平台,彼时,Kotlin将真正作为一门成熟的跨平台语言出现在大家面前,想想都令人激动。我们知道,Kotlin可以编译成Jvm字节码运行在Java虚拟机上,也可以编译成JavaScript运行在浏览器、Node等JavaScript环境中,甚至可以编译成机器码,直接运行在机器本地环境中,也就是说,如果一份代码不依赖各个平台特有的Api,理论上它就可以编译成上述三个平台代码中的任何一个,简单来说,Kotlin的跨平台就是这样的逻辑。当然,Kotlin会对一些平台无关的语言层面的Api做封装,提供一个跨平台的标准库,所以大家在编写跨平台代码时需要依赖下面这个:dependencies{ compile"org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version" }复制这个库提供了基本的语言

  • 指针3

    #include <stdio.h> /* 2018-05-28 如何通过被调函数修改主调函数普通变量的值 1,实参必须为该普通变量的地址 2,形参必须为指针变量 3,在背调函数中通过 *形参名 = 。。。。。 的方式就可以修改主调函数相关变量的值 */ f(int *i,int *j) { *i = 4; *j = 5; return 0; } int main(void) { int a = 3,b = 5; f(&a,&b); //发送a和b的地址到函数f,然后修改该地址的数值 printf("a = %d,b = %d\n",a,b); }复制#include <stdio.h> /* 指针和数组 指针和一位数组 一维数组名 一维数组名是个指针常亮 它存放的是一维数组第一个元素地址 程序 printf("%#X\n",&a[0]); printf("%#X\n"

  • KMP子字符串查找算法

    KMP子字符串查找算法概述算法的基本思想是:当出现不匹配时,就能知晓一部分文本的内容,可以利用这些信息避免将指针回退到所有这些已知的字符串之前。DFA(确定有限状态机)模拟提前判断如何重新查找,而这种判断只取决于模式本身,所以可以对模式的字符序列做一个确定有限状态机。DFA的数据结构表示为二维数组dfa[R][M],其中R为指定字典中的字符集的个数(比如ASCII为256),M为匹配字符串pat的长度,状态的意思是文本中某个位置i匹配pat的程度,0状态为未匹配状态,M状态为终止状态,找到了完整匹配的字符串。 如图中R=3,M=6,二维数组中的值指向下一个状态。 构造DFA穷举模式pat的所有可能情况,将这些情况用状态图表示。其中X记录匹配失败时重启的索引位置。编码实现用暴力算法实现子字符串查找算法publicintsearch(Stringtxt,Stringpat){ inti,N=txt.length(); intj,M=pat.length(); for(i=0,j=0;i<N&&j<M;i++){ if(txt.charAt(i)==pat.ch

  • PHP查询QQ电脑在线状态接口源码

    <?php if($_GET['qq']){ $qq=$_GET['qq']; $data=file_get_contents("http://webpresence.qq.com/getonline?type=1&$qq:"); $data||$data=strlen(file_get_contents("http://wpa.qq.com/pa?p=2:$qq:45")); if(!$data){return0;} switch((string)$data){ case'online[0]=0;':exit('{"code":"0","state":"电脑离线"}');return; case'online[0]=1;':exit('{"code":"1","state":&quo

  • 自 Ian Goodfellow 之后,GANs 还有哪些开拓性进展?

    编者按:本文由作者AditDeshpande总结,AI研习社编译整理。AditDeshpande目前是UCLA计算机科学专业生物信息学方向的大二学生。他热衷于将自己的机器学习和计算机视觉技术应用在健康领域,给医生和患者带来更好的解决方案。一直以来,AditDeshpande都有总结和解释一些深度学习论文的习惯,在本文中,AditDeshpande将围绕对抗生成网络(GANs)的主题来展开介绍。(文中相关链接见文末“阅读原文”)█介绍YannLeCun在Quora上曾说,“对抗训练是自切片面包出现以来最酷的东西”。我也同意他说的,因为切片面包从未在深度学习的圈子里引起如此多的关注和兴奋。在这篇总结里,我们一起来看看3篇基于IanGoodfellow在2014年发表的开拓性工作的文章。█生成对抗网络(GANs)概述我在之前的博文,《9篇你要知道的深度学习论文》,里提到过IanGoodfellow生成对抗网络的论文。那些网络模型大致是,你有两个模型,一个生成模型(generativemodel)和一个辨别模型(discriminativemodel)。辨别模型的任务是决定一张图片是自然的(来

  • 腾讯云数据传输服务完成数据迁移任务数据传输服务API20180330

    1.接口描述接口请求域名:dts.tencentcloudapi.com。 本接口(CompleteMigrateJob)用于完成数据迁移任务。选择采用增量迁移方式的任务,需要在迁移进度进入准备完成阶段后,调用本接口,停止迁移增量数据。通过DescribeMigrateJobs接口查询到任务的状态为准备完成(status=8)时,此时可以调用本接口完成迁移任务。 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:CompleteMigrateJob。 Version 是 String 公共参数,本接口取值:2018-03-30。 Region 是 String 公共参数,详见产品支持的地域列表。 JobId 是 String 数据迁

  • LeetCode - 数组遍历

    1.485.最大连续1的个数 1.1分析题意 首先:我们求的是连续的1的个数,所以我们不能也没必要对数组进行排序; 其次:只要求求出最大连续1的个数,并不要求具体的区间数目,所以我们只需要用一个值来记录这个结果; 1.2思路分析: 一个for循环遍历数组里面的每一个元素,当前元素有两种情况: 当前元素为1,那就将temp+1; 如果当前元素不是1,那就更新ans并将temp重置为0; 1.3复杂度分析 时间复杂度:O(n) 空间复杂度:O(1) 2.495.提莫攻击 2.1题意理解 我觉得这道题的关键点在: 如果提莫在中毒影响结束前再次攻击,中毒状态计时器将会重置,在新的攻击之后,中毒影响将会在 duration秒后结束。 翻译成人话就是:中毒期间再次中毒,会按照新的中毒终止时间计算。 2.2思路分析 定义两个变量,start和end分别表示当前中毒状态下的起始时间和终止时间,初始化为第一次中毒时的参数设置; 然后遍历下一次中毒参数,此时会有两种情况: 下一次中毒的起始时间next_start≤end,这就导致中毒区间重置,所以我们将end更新为新的next_

  • React(17.0版本)生命周期概述

    React17版本的生命周期概述。 挂载 示例代码在下方。 当组件实例被创建并插入DOM的时候,其生命周期被调用顺序如下: constructor(props)-初始化state和为事件处理函数绑定实例; staticgetDerivedStateFromProps(props,state)-当state的值在任何时候都取决于props时使用,返回一个对象来更新state,返回null则不更新; render()-渲染React组件; componentDidMount()-组件挂载后调用,一个生命周期内仅一次; 更新 当组件的props或state发生变化时会触发更新。组件更新的生命周期顺序如下: staticgetDerivedStateFromProps(props,state); shouldComponentUpdate(nextProps,nextState)-根据更新后的state或props判断是否重新渲染DOM,返回值为布尔值,常用来性能优化; render(); getSnapshotBeforeUpdate(prevProps,prevState)-是

  • 面试 8:快慢指针法玩转链表算法面试(二)

    昨天在最后给大家留了拓展题,不知道大家有没有思考完成,其实南尘说有巨坑是吓大家的啦,实际上也没什么。我们来继续看看昨天这个拓展题。 面试题:给定单链表的头结点,删除单链表的倒数第k个结点。 前面的文章见链接:面试7:面试常见的链表算法捷径(一) 这个题和前面的文章中增加了一个操作,除了找出来这个结点,我们还要删除它。删除一个结点,想必大家必定也知道:要想操作(添加、删除)单链表的某个结点,那我们还得知道这个节点的前一个节点。所以我们要删除倒数第k个结点,就必须要找到倒数第k+1个结点。然后把倒数第k+1个元素的next变量p.next指向p.next.next。 我们找到倒数第k个结点的时候,先让fast走了k-1步,然后再让slow变量和fast同步走,它们之间就会一直保持k-1的距离,所以当fast到链表尾结点的时候,slow刚刚指向的是倒数第k个结点。 本题由于我们要知道倒数第k+1个结点,所以得让fast先走k步,待fast指向链表尾结点的时候,slow正好指向倒数第k+1个结点。 我们简单思考一下临界值: 当k=1的时候,删除的值是尾结点。我们让fast先走1步,当f

  • Shader学习笔记 01 - 溶解

    一般3D溶解 边缘溶解 使用噪声贴图或者程序噪声,通过范围0-1的float材质参数在片元着色器进行clip操作。 float_DissolveDegree;//材质参数:溶解程度 //fbm程序噪声生成 floattest=fbm(i.uv)-_DissolveDegree; clip(test); 复制 边缘颜色 使用hdr、渐变纹理(RampTexture)、bloom提高效果。 程序噪声参考link 示例源码: Shader"DissolvePack/unlit/DissolveSh" { Properties { _MainTex("Texture",2D)="white"{} _RampTexture("RampTexture",2D)="white"{} _Color("Tint",Color)=(1,1,1,1) _Color2("BurnColor",Color)=(1,1,1,1) _DissolveDegree("DissolveDegree",Range(0,1))=0 _DissolveOffset("DissolveOffset",Range(0.

  • 解决C#程序只允许运行一个实例的几种方法详解

    方法一:使用线程互斥变量.通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: usingSystem; usingSystem.Windows.Forms; usingSystem.Runtime.InteropServices; namespaceNetTools { staticclassProgram { [DllImport("user32.dll")] privatestaticexternboolFlashWindow(IntPtrhWnd,boolbInvert); [DllImport("user32.dll")] privatestaticexternboolFlashWindowEx(intpfwi); ///<summary> ///应用程序的主入口点。 ///</summary> [STAThread] staticvoidMain() { boolrunone; System.Threading.Mutexrun=newSystem.Threading.Mutex(true,"singl

  • 两款paste临时文本分享平台

    PasteMe PasteMe是一个无需注册的文本分享平台,针对代码提供了额外的高亮功能。 在存储内容时,设置密码和阅后即焚可以高度保证用户内容的安全性和私密性。 在将自己的内容分享给别人时,提供了一键复制链接和二维码分享等多种途径。 在查看别人的内容时,可以一键复制所有文本。如果查看的是阅后即焚的内容,那么在网页加载完成之前,实体数据就已经不存在了 Docker运行命令: dockerrun-d--namepasteme-lite-p80:8000jonnyan404/pasteme 预览地址:https://pasteme.cn/ Dockerhub地址:https://hub.docker.com/r/jonnyan404/pasteme PrivateBin Docker运行命令: dockerrun-d--restart="always"--read-only-p8080:8080privatebin/nginx-fpm-alpine 唯一需要注意的是:这个需要前置https反代,否则无法正常使用~~~ 预览地址:https://privatebi

  • 调用系统框架使用设备系统语言的设置,相册相机设置为中文

    调用系统相册、相机发现是英文的系统相簿界面后标题显示“photos”,但是手机语言已经设置显示中文,发现在项目的info.plist里面添加LocalizedresourcescanbemixedYES(表示是否允许应用程序获取框架库内语言)即可解决这个问题。

  • 【贪心】【POJ-1992】Ride to School

    Description ManygraduatestudentsofPekingUniversityarelivinginWanliuCampus,whichis4.5kilometersfromthemaincampus–Yanyuan.StudentsinWanliuhavetoeithertakeabusorrideabiketogotoschool.DuetothebadtrafficinBeijing,manystudentschoosetorideabike. Wemayassumethatallthestudentsexcept"Charley"ridefromWanliutoYanyuanatafixedspeed.Charleyisastudentwithadifferentridinghabit–healwaystriestofollowanotherridertoavoidridingalone.WhenCharleygetstothegateofWanliu,hewilllookforsomeonewhoissettingofftoYanyuan.If

  • 生成商户订单号/退款单号

    publicstaticStringgetRandomStringByLength(intlength){ Stringbase="0123456789"; Randomrandom=newRandom(); StringBuffersb=newStringBuffer(); for(inti=0;i<length;i++){ intnumber=random.nextInt(base.length()); sb.append(base.charAt(number)); } returnsb.toString(); } /** *@function生成商户订单号/退款单号 *@date2015-12-17 *@returnString */ publicstaticStringgetOrderNo(){ SimpleDateFormatsdf=newSimpleDateFormat("yyyyMMddHHmmssSSS"); Datedate=newDate(); returnsdf.format(date)+getRandomStringByLength(4); } 复制

  • [LeetCode] 203. 移除链表元素(链表基本操作-删除)、876. 链表的中间结点(链表基本操作-找中间结点)

    题目203.移除链表元素 删除链表中等于给定值val的所有节点。 题解 删除结点:要注意虚拟头节点。 代码 classSolution{ publicListNoderemoveElements(ListNodehead,intval){ ListNodepre=newListNode(-1); pre.next=head; ListNodecur=pre; while(cur.next!=null){ if(cur.next.val==val){//每次判断的是cur.next cur.next=cur.next.next; }else{//注意是else cur=cur.next; } } returnpre.next; } } 复制 题目876.链表的中间结点 给定一个带有头结点head的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 题解 注意while中的条件,使得快指针是有效的。 代码 classSolution{ publicListNodemiddleNode(ListNodehead){ ListNodequick=head,slow=h

  • KeePass全网最详使用指南

    从入门到熟练:KeePass全网最详使用指南 https://post.smzdm.com/p/713042/  

  • mysql数据库优化

    1.数据库自身的优化   a.如何选择mysql的存储引擎:     innodb:事务要求高,保存的数据都是重要数据,如订单表,账号表.;     myisam:事务要求不高,查询和添加为主的,如bbs中的发帖表,回复表,但是不支持外键( 一定要定时进行碎片整理,因为数据删了文件大小没有变:optimizetable表名;);     Memory:数据变化频繁,不需要入库,同时又频繁的查询和修改,速度极快;   b.数据和日志文件分开存放在不同磁盘上      数据文件和日志文件的操作会产生大量的I/O。在可能的条件下,日志文件应该存放在一个与数据和索引所在的数据文件不同的硬盘上以分散I/O,同时还有利于数据库的灾难恢复。   c.数据库参数配置,比如缓存大小,最大连接数等   d.读写分离或者分布式数据库 2.数据库表的优化   a.表的设计遵循3范式     首先符合1NF,才能满足2NF,进一步满足3NF。     1NF:即表的列的具有原子性,不可再分解,即列的信息,不能分解,只有数据库是关系型数据库(mysql/oracle/db2/informix/

  • 安装配置Redis手册

    安装配置Redis手册 1.yum安装运维维护版本redis-4.0.12 yuminstallredis 复制 2.修改配置增加AuthenticationPassword #生成随机密钥 pwgen-s16-1 #vim/usr/local/redis6379/redis.conf #debugverbosenoticewarning loglevelnotice requirepassp5F6AsKTVZvpuH6p #masterslave masterauthKXFwiqY1MYpLvyqv slaveof10.16.19.1886379 #快捷操作 echo"requirepassp5F6AsKTVZvpuH6p">>/usr/local/redis6379/redis.conf 复制 3.重启Redis systemctlrestartredis6379 复制 4.发现的问题 一是:Redis未设置密码,并且允许通过网络开放访问; 二是:如果增加密码配置,无法通过上面的命令重启 #停止是使用调用的命令redis-clishutdown,修改/usr/l

相关推荐

推荐阅读