ES6 拓展(下)

news2024/11/27 20:37:26

一、函数的拓展

1.1、默认参数

在ES5中设置默认参数:


function func(words, name) {
  name = name || "闷墩儿";
  console.log(words, name);
}
func("大家好!我是");
func("大家好!我是", "憨憨");
 func("大家好!我是", "");

在控制台可以看见如下:

在以上代码中:

  • func函数一共有两个形式参数,在func('大家好!我是') 我们指定第一个形式参数words的值,所以name 使用的默认值【闷墩儿】

  • 在 func('大家好!我是','憨憨')中我们指定了两个形式参数的值,所以name没有使用默认值。

  • 在 func('大家好!我是','')中我们指定了第二个形式参数为空字符串,被认为是没有赋值,所以也使用的是默认值。

:如果我们想给形式参数设置默值需要在函数中单独定义。

在ES6中我们可以直接在函数的形参里设置默认值。

举个例子:

新建一个 index.html 文件,在文件中写入以下内容:


function func(words,name="草莓"){
console.log(words,name);
}
func("请给我一个");
func("请给我一个","梨");
func("请给我一个","");

在上面的代码中:

  • func("请给我一个") 只传入第一个参数,第二个参数没传入任何值,故第二个参数使用了默认值。

  • func("请给我一个","梨") 传入了二个参数,所以第二个参数没有使用默认值。

  • func("请给我一个","") 第二个参数,虽然传入的是空字符串,空字符串也算是一个参数值,故同样不会使用默认值。

可以看到在函数中设置默认值,如果传入的第二个参数值为空字符串,会被当作值传入,而不会使用默认值。

参数变量是默认声明的,我们不能用let或者const 再次声明

举个例子:


function func(words, name= "草莓"){
     let words ="我需要一个";
     console.log(words,name);
}
func("请给我一个","梨");

可以看到控制台出现了报错:

在设置默认值的时候也要注意设置的位置:

设置默认值的参数,一般放在其他参数的后面,也就是尾部。

如果给第一个形参设置了默认值,调用函数传参时,无法省略该参数,将会直接代替。

举个例子:


function func(words ="你好",name){
     console.log(`${words}${name}`);
}
func("小蓝");

在控制台可以看见,传入函数的值“小蓝”,被当作第一个参数的值,而第二个参数没有传入值,所以输出的是 undefined.

使用自定义函数作为形式参数的默认值:

举个例子:


function part(){
     return "❤";
}
function func(words,name =part()){
    console.log(words,name);
}
func("请给我一颗");
func("请给我一颗","💗");

在控制台可以看见:

在上面的代码中:

  • 我们定义了一个名为 parameter 的函数,在函数中返回了一颗黑色的爱心。

  • 给 func 函数中的第二个形式参数设置默认参数为 parameter 函数中的返回值。

  • 使用 func('请给我一颗小'),只设置了第一个形参的值,所以第二个参数使用的是默认值「小黑心」。

  • 使用 func('请给我一颗小','💗'),设置了两个形参的值,所以第二个参数没有使用默认值。

解构参数

解构可以用在函数参数传递的过程中。

举个例子:


function func(name,value,mount,{a,b,c,d= "苹果"}){
     console.log(`${name}用${value}元钱买了${mount}
     个${d}。`);
     console.log(`${name}用${value}元钱买了${mount}
     个${d}。`);
}
func("小蓝",5,3,{
    a:"小蓝",
    b:"菠萝",
    c:"桃子",
});

在控制台可以看见如下输出:

在上面的代码中:

  • func 函数包含了4个参数,其中4个参数是解构参数,解构参数里面包含4个参数变量 a,b,c,d。

  • 使用func('小蓝',5,3,{a:'西瓜',b:'菠萝',c:'桃子'}) 调用该函数,其中传入name 参数的值为“小蓝”,value 参数的值为 5,mount 参数的值为 3;解构参数只传入三个值,a 的值为“西瓜”,b 的值为“菠萝”,c 的值为“桃子”,d 使用的是默认值。

在上面代码中可以看出,解构参数是以键值对的形式传入的,其参数名与键值名保持一致,即为成功。

rest参数

rest 参数又称剩余参数,用于获取函数的多余参数。rest参数搭配的变量是一个数组,改变量将多余的参数放入数组中。

rest 参数和扩展运算符在写法上样,都是三点(...),但两者的使用方法上是截然不同的。

扩展运算符就像是rest参数的逆运算,主要用于以下几个方面:

  • 改变函数的调用。

  • 数组构造。

  • 数组解构。

rest 参数语法格式为:


myfunction(parameters,...rest);
//剩余参数必须是函数的最后一个参数

举个例子:


function func(a,b,...rest){
    console.log(rest);
}
func(1,2,3,4,5,6,7,8);

在控制台可以到如下输出:

在上面代码中,给了func函数传入了10个参数,形式参数a和b 各取一个值,多余的8个参数都被rest参数获取。

箭头函数

箭头函数,顾名思义,就是箭头(=>)来表示的函数。箭头函数和普通函数都是用来定义函数的,但两者在语法构成上有所不同。

新建一个文件,使用es5的方式定义一个函数。


let sum = function (a,b){
    return a+b;
}
console.log(sum(1,2));

上面定义了一个求和函数

修改代码使用箭头函数:


let  sum=(a,b)=>a+b;
console.log(sum(1,2));

两个程序都会显示输出为 3

可以看出使用箭头函数代码变得简洁了。

箭头函数的基本使用方法:


(param1,param2,...,paramN)=>{expression}

箭头函数前面()放着函数的参数,箭头函数后面{}放着函数内部执行的表达式。

箭头函数除了代码简洁之外,还解决了匿名函数的this 指向问题。

this 指向

this 是指想调用包含自身函数对应的对象。

一个函数能够实现在指定时间周期内一直计数。用es5语法实现:


function Number(){
    var that= this;
    that.num=1;
    setInterval(function count(){
    that.num++;
     },1000);
}
在上面例子中,定义了一个名 Number() 的函数,该函数里包含一个 num 参数。在 Number() 函数里有一个 count() 的函数,在其内部让 num 自增。count 函数是作为 setInterval() 函数的参数而存在的,setInterval() 函数的作用是在某个周期内自动调用函数。

可以看到什么两个函数中,每个函数都会定义自己的this ,this 只会处在于你所使用的作用域范围内。

而在箭头函数中的this 对象,就是定义改函数所在的作用域所指向的对象,而不是使用所在作用域指向的对象。


function Number(){
    this.num=1;
    setInterval(()=>{
    this.num++;
    },100);
}    

总结一下区别:

  • 箭头函数的this 指向是其上下文的this,没有方法可以改变其指向。

  • 普通函数的this 指向调用它的那个对象。

二.类的扩展

四.异步编程

1.1 Promise 对象基础应用

在开发中,会遇到这样的需求:通过接口1的返回值,去获取接口2的数据,然后通过接口2的返回值,获取接口3的数据。即每次请求接口数据时,都需要使用上一次的返回值。为了实现这个需求,通常回事用回调函数来完成,即把函数作为参数进行层层嵌套。

代码如下:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
     var outnum = function(n, callback){
        setTimeout(function(){
            console.log(n);
            callback();
        },100);
};
    outnum("1",function(){
        outnum("2",function(){
            outnum("3",function(){
                console.log("0")'
            };
        };
    }; 
    </script>
  </body>
</html>

在上述代码中,我们可以发现可以通过回调函数层层嵌套的形式达到最终数据请求的目的,但代码结构不明朗,可读性差。

定义Promise

为了解决这种地狱式回调,可以使用Promise对象 ,且代码更优雅,由于Promise对象是一个构造函数,必须通过实例化来生成,定义格式代码如下:


let  p= new Promise(function(resolve,reject){
    //异步事件
}

在定义格式的代码中,需要说明的几个问题:

  • 在实例化中,参数为函数,函数中又有两个用于回调的函数

  • 两个回调函数中, resolve 为异步成功执行时的回调,其参数可以传递执行的结构。

  • reject为异步执行失败的回调,其参数可以传递失败的结果信息。

使用 resolve和reject方法传递出去的参数,需要用到then方法接收。

Promise对象的then方法

Promise对象实例化之后,可以调用 then 方法获取两个回调函数中的传参值,该方法接收两个回调函数作为参数,第一个参数是必选参数,表示异步成功执行后的resolve 回调函数,第二个参数是可选参数,表示异步失败后执行的reject 回调函数。

格式如下:


p.then( 
    function(v){},
    function(e){}
);

其中参数v的值表示resolve回调函数的参数值,e值表示reject回调函数中的参数值。

如下列代码所示:


let  n=6;
let p2 =new Promise(function(resolve,reject){
    setTimeout(function(){
        if(n>5){
            resolve(n);
         }else{
            reject("必须大于5")
         }
       });
   });
p2.then(
    function(v){
        console.log(v);
    },
    fucntion(e){
        console.log(e);
    }
);
//结果是 6

此外,一个then方法执行后,如果仍然返回一个Promise对象,则可以继续在执行then方法,形成链式结构

解决地狱式回调

使用Promise来实现开头提到的需求,从而解决由此引起的回调地狱问题。

代码如下:


<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
       var   outnum= function(order){
         return new Promise(function(resolve,reject){
            setTimeout(function(){
                console.log(order);
                resolve(); //完成异步回调后执行函数
            },1000);
    });
};
    outnum("1")
        .then(function(){
            return outnum("2");
        })
            .then(function(){
                return outnum("3");
            })
                .then(function(){
                      return outnum("0");
                });
    </script>
  </body>
</html>
执行上述代码之后的页面效果与使用地狱式回调方式是完全一样的,但 Promise 对象实现的代码可读性更强,还可以很方便地取到异步执行后传递的参数值,因此,这种代码的实现方式,更适合在异步编程中使用。

Promise 对象中的方法

1.1 Promise.all 方法

  • Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。

是不是感觉上面的解释太简便了,以至于对它的用法有点模糊。那我们就详细地对Promise.all进行解释。

其实我们可以从参数和返回值两个方面对Promise.all()进行剖析。

首先是参数方面:

  • Promise.all()的参数是一个包含多个Promise实例的数组(当然数组内部Promise实例数量可以是一个,但那就没必要使用all方法,但会在你不清楚Promise实例数量时使用)。

然后看返回值方面。

返回值要分为两种情况:

  • 第一种情况就是数组内部的Promise实例全部成功,就是状态变为resolve,注意是全部,全部,全部(all)。这样它的返回值也是一个数组,但是这个数组里面的元素变为对应的原Promise实例的resolve状态的值。后面可以调用then方法使用。
  • 第二种情况就是数组内部的Promise实例没有全部成功,这样它的状态就会变为reject拒绝状态。

这样的话,我们就可以做一个简单地总结:

  • Promise.all()方法就是检测参数数组内部的所有Promise实例是否成功,若成功,则调用then方法进行处理,否则变为reject状态。

重点还是all,all,all。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用React18+Ts创建项目

1. 创建项目 首先&#xff0c;使用create-react-app工具创建一个新的React项目&#xff1a; npx create-react-app 项目名 --template typescript2. 安装依赖项 使用脚手架创建项目后&#xff0c;自带react-dom等依赖项&#xff0c;但react中的所用的路由方法是react-router…

建站系列(八)--- 本地开发环境搭建(WNMP)

目录 相关系列文章前言一、准备工作二、Nginx安装三、MySQL安装四、PHP安装及Nginx配置五、总结 相关系列文章 建站系列&#xff08;一&#xff09;— 网站基本常识 建站系列&#xff08;二&#xff09;— 域名、IP地址、URL、端口详解 建站系列&#xff08;三&#xff09;— …

cookie、session、Token区别

1 HTTP无状态&#xff0c;什么是无状态&#xff1f; http 无法知道是哪个客户端发出的请求&#xff0c;也无法判断是否为已登录用户请求&#xff0c;这就导致了 http 无法记住用户的登录状态。 2 cookie和session的是什么&#xff1f;为什么session这么好还要用cookie? coo…

VR钢铁实训 | 铁前事业部虚拟仿真培训软件

随着科技的发展&#xff0c;虚拟现实技术在各个行业中的应用越来越广泛。在钢铁冶炼行业中&#xff0c;VR技术也逐渐得到了应用&#xff0c;其中铁前事业部虚拟仿真培训软件就是一项非常有优势的技术。 铁前事业部虚拟仿真培训软件是广州华锐互动打造的《钢铁生产VR虚拟培训系统…

MySQL的用户管理

1、MySQL的用户管理 &#xff08;1&#xff09;创建用户 create user zhang3 identified by 123123;表示创建名称为zhang3的用户&#xff0c;密码设为123123。 &#xff08;2&#xff09;了解user表 1&#xff09;查看用户 select host,user,authentication_string,select…

react memo判断刷新机制 自定义的比较函数 避免重复渲染

需求&#xff1a; 1. 需要在courseList参数变化时重新渲染组件。 2. 需要在currentWeekNumber参数 等于我指定值才重新渲染组件。 3.以上2个条件同时满足。 遇到的坑 一开始实现了我上面指定的问题需要的函数&#xff0c;后面发现怎么都刷新不了&#xff0c;经过深入观察发现m…

【ESP32】串口+wifi 透传,以及回调函数的使用

本文主要记录【ESP32】串口wifi 透传】的学习记录&#xff0c;主要包括 1.串口的AT 模式和透传模式 2. 串口命令解析 3. socket 连接 4. 回调函数的使用 【ESP32】串口wifi 透传&#xff0c;以及回调函数的使用 1. 函数接口说明2.开发环境3.硬件连接4.测试结果4.1发送 ATWS 命令…

Linux学习笔记-Ubuntu系统用户、群组、权限管理

一、概述 本文记录Ubuntu系统下通过命令操作用户账户进行管理。 Ubuntu系统版本&#xff1a; Linux ubuntu 5.15.0-1034-raspi #37-Ubuntu SMP PREEMPT Mon Jul 17 10:02:14 UTC 2023 aarch64 aarch64 aarch64 GNU/Linux 注&#xff1a;查看系统版本号的指令如下 uname -…

YOLOV7改进-针对小目标的NWD(损失函数)

link 1、复制这些 2、utils-loss&#xff0c;这里加 3、把这几行复制到utiils的loss.py 4、先对CoputerLoss类做修改 5、把那一行替换成这个 6、修改 7、iou_ration是超参&#xff0c;可以调&#xff0c;如果小目标比较多的话&#xff0c;这个值可以低一些&#xff0c;…

Vuex - state 状态(获取和使用共享数据)

文章目录 一、state是什么&#xff1f;二、state状态的作用三、如何使用store数据呢&#xff1f;使用数据的两种方式&#xff1a;1. 通过store 直接访问2. 通过辅助函数访问(简化) 一、state是什么&#xff1f; state是状态&#xff08;数据&#xff09; &#xff0c; 类似于v…

redis集群最少使用三个主节点的原因

集群最少三个主节点的原因 https://redis.io/docs/management/scaling/ 官网建议&#xff0c;搭建 redis 集群最少三主三从。 但是这么做是出于什么考虑呢&#xff1f; https://blog.csdn.net/qq_35549286/article/details/127057374 借鉴这位的解答 为什么是三个? cluster各…

骨传导与入耳式耳机哪种音质好?该如何选择?

骨传导耳机和传统耳机的定位不同&#xff0c;所以没有可比性&#xff0c;如果一定要说哪款耳机音质好&#xff0c;答案是入耳式耳机音质比较好&#xff01; 首先入耳式耳机是直接塞入耳朵佩戴&#xff0c;会最大程度减少漏音&#xff0c;同时不会改变音质&#xff0c;会直接传…

构建自定义美颜应用:全局美颜SDK的开发指南

美颜技术已经成为许多应用程序和平台的标配之一&#xff0c;为用户提供了改善外观的机会。为了在你的应用中提供自定义的美颜功能&#xff0c;你可以考虑使用全局美颜SDK。本文将向你介绍如何构建自定义美颜应用&#xff0c;以及开发全局美颜SDK的关键步骤和技巧。 一、明确需…

Revit SDK 介绍:RayTraceBounce 光线反弹

前言 这个例子模拟光线反弹。 内容 通过修改参数&#xff0c;从&#xff08;0&#xff0c;0&#xff0c;0&#xff09;点向&#xff08;1&#xff0c;0&#xff0c;0&#xff09;方向射出光线&#xff0c;经过若干次反弹之后的结果。如图所示&#xff1a; 在Revit API 中&…

通过 http-server 运行刚打包出来的脚手架项目

这里 我打包了自己的vue项目 react其实也一样 如果我直接 打开打包出来的 dist 下面的index.html 会出现白屏资源找不到 或者跨域等问题 这个问题其实配个nginx也能解决 但是其实如果只是想做个测试 nginx就太麻烦了 我们可以通过npm指令 全局安装一个http-server 终端执行 …

每日刷题|回溯法解决全排列问题第二弹之解决字符串、字母大小排列问题

食用指南&#xff1a;本文为作者刷题中认为有必要记录的题目 前置知识&#xff1a;回溯法经典问题之全排列 ♈️今日夜电波&#xff1a;带我去找夜生活—告五人 0:49 ━━━━━━️&#x1f49f;──────── 4:59 …

OpenRoads Designer道路旁添加公交车停车区

在道路工程建模时如果需要在路旁添加公交车停车区&#xff0c;如下图所示&#xff0c;可通过对道路轴线进行局部偏移的方式实现。 在道路旁添加如上图所示的公交车停车区操作步骤&#xff1a; 1、使用Geometry下的Single Offset Partial将路线中的一段进行偏移&#xff1a; 参数…

亚马逊、ManoMano等跨境电商平台测评还能做吗?

亚马逊测评是卖家通过真实购买商品并撰写评价来获取评价权利的过程 卖家账号发布产品后&#xff0c;测评买家账号进入商铺进行购买并对商品质量、外观、卖家服务态度和物流体验等方面进行点星留评 在亚马逊卖家运营中&#xff0c;评论是一个关键而必不可少的环节&#xff0c;…

本地起一个VUE 前端项目

#安装 安装 Vue CLI 3&#xff1a; Vue CLI是一个用于创建和管理Vue项目的命令行工具 npm install -g vue/cli#查看更详细的告警信息 npm install -g vue/cli --verbose#检查项目的依赖关系 ,保持项目的依赖关系最新和安全 npm audit npm audit fix#查看版本 vue --version#创建…

oled或数码管点阵的字模矩阵的原理讲解

通过取模软件得到的T字符的矩阵分析 字模选项中常用的设置的意义&#xff1a; **字宽和字高&#xff1a;**显示字符能够使用的长宽灯数量&#xff0c;也可以理解为像素 **点阵格式&#xff1a;**需要考虑实际焊接电路。阴码&#xff1a;灯共阴极&#xff0c;控制器输出高电位&…