ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代

这篇具有很好参考价值的文章主要介绍了ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 对象的剩余参数与扩展运算符

1.1 对象的剩余参数

let obj = {
name:"kerwin",
age:100,
location:"dalian"
}
let {name,...other} = obj
console.log(name,other)
function test({name,...other}){
console.log(name,other)
test(obi)

// kerwin {age:100,location: ‘dalian’}
其中…other 可以拿到对象的剩余参数

1.2 扩展运算符

let obj1= {
name:"tiechui",
location:"dalian"
}
let obj2 = {
name:"xiaoming",
age:18
}
//object.assign
let obj3 = {...obj1,...obj2}
console.log(obj3)

// {name: ‘xiaoming’,location: ‘dalian’,age: 18]

在实际开发中,我们会使用ajax() 封装一些默认的属性和属性值,以备用户忘记或未传入某些参数。

function ajax(options){
const defaultoptions = {
methods:"get",
async:true
}
options = {...defaultoptions,...options}
// 这样写会将用户传入的某些参数值覆盖某些默认参数值
console.log(options)
}
ajax({
url: "/api"
})

// { methods: “get”, async: true, url: “/api”}

2. 正则扩展

正则表达式命名捕获组

JS正则表达式可以返回一个匹配的对象,一个包含匹配字符串的类数组,比如:以Y-MM-DD的格式解析日期,这样的代码可读性很差,并且在改变正则表达式的结构的时候很有可能就会改变匹配对象的索!
ES9允许使用命名捕获 ? ,在打开捕获括号后立即命名

let str= "今天是2022-10-10"
let reg= /[0-9]{4}-[0-9]{2}-[0-9]{2}/
//exec()  捕获
cconsole.log(reg.exec(str))

ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript
如果想要分组单独得到年月日:

let reg= (/[0-9]{4})-([0-9]{2})-([0-9]{2}/)

ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript
使用reg[index] 就可以得到单独的年月日
给各个分组添加 ?<名称> 就可以使得各个分组带有意义,通过名称就可以找到各个分组。

let reg= (/?<year>[0-9]{4})-(?<month>[0-9]{2})-(?<day>[0-9]{2}/)
let {year,month,day} = res.groups
console.log(year,month,day)

// 2022 10 10

3. Promise.finally

我们之前学习Promise 时,当对象调用resolve 时会执行某些程序,调用reject 时会执行某些程序,执行这些程序之前我们要呈现加载中的状态,待到执行了程序之后我们再关闭加载的状态,这时就出现一个问题,我们想在成功或者不成功时都调用某个程序,我们需要怎么写呢?

我们可以使用finally() ,也就是我们可以将这些不论程序执行成功还是失败都要执行的代码,比如隐藏loading 写在finally() 中。

function ajax(){
return new Promise((resolve,reject)=>{
//resolve("data-1111")
reject("err-11111")
})
}
//显示 loading
ajax().then((data)=>{
console.log(data)
// 隐藏 loading
}).catch(err=>{
console.log("err",err)
// 隐藏 loading
}).final1y()=>{
console.log("finally")
//隐藏loading
})

4. 异步迭代

4.1 同步遍历器的问题

现在有一个数组,其中放了几个异步任务,需要它们按照数组任务顺序来执行,也就是上一个执行完了之后再去执行下一个任务。

function timer(t){
return new Promise(resolve=>{
setTimeout(()=>{
resolve("data-"+t)
},t)
})
}
async function test(){
let arr = [timer(1000),timer(2000),timer(3000)]
for(let item of arr){
console.log(await item)
}
test()

ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript
这种将异步任务放在数组中使用循环执行的情况会出现程序并发执行,并不是我们想要的效果。

如果我们将上面for 循环中的代码换成下面的代码,我们会发现第三行和第四行代码是同时出现的,也就是for 循环中的程序只有await 这一行卡住了。

for(let item of arr){
console.log("start-",Date.now())
console.log(await item)
console.log("end-",Date.now())
}

那有没有一种可能我们可以卡住整个for 循环代码快?如果第一个任务不结束,那么整个代码块都不执行;如果第一个任务结束,就让整个代码块就一起执行下来。
异步遍历器就可以实现这种任务调度的情况。

我们先来回顾一下同步遍历器!

let arr = [1,2,3]
// console.log()
let i = arr[Symbol.iterator]()
console.log(i.next())
console.log(i.next())
console.log(i.next())
console.log(i.next())
for(let i of arr){
console.log(i)
}

ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript

4.2 异步遍历器使用

function ajax(data){
return new Promise(resoLve=>{
resolve(data)
})
function *gen(){
yield ajax(111)
yield ajax(222)
}
let g = gen()

我们知道上面的生成器代码可以生成同步遍历器,需要使用next() 进行执行,如果next() 调用次数超过需要的次数还会报错。ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript
这时就需要我们的异步生成器了,但是我们怎样生成异步遍历器呢?
只需要在生成器前面添加async !
异步遍历器需要通过下面的程序顺序进行。
ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript
我们也可以把上面异步遍历器执行代码换成下面的代码

async function test(){
let res1 = await g.next()
console.log(res1)
let res2 = await g.next()
console.log(res2)
let res3 = await g.next()
console.log(res3)
}
async function test(){
let list = [g.next(),g.next(),g.next()]
for await(let i of list){
console.log(i)
}
// 

学习过异步遍历器后,对于一开始学习异步迭代提出的问题我们可以通过下面的代码改进。

function timer(t){
return new Promise(resolve=>{
setTimeout(()=>{
resolve("data-"+t)
},t)
})
}
async function *gen(){
yield timer(1000)
yield timer(2000)
yield timer(3000)
async function test(){
let g = gen()
let arr = [g.next(),g.next(),g.next()]
for await(let item of arr){
console.log("start-",Date.now())
console.log(item)
console.log("end-",Date.now())
test()

ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代,ES6-ES13,学习,javascript
注意使用for await 循环不能去循环普通的数组,会出问题的,我们一般使用这个循环去遍历由异步生成器生成的对象组成的数组。

在node 中使用任务调度使用的较多。文章来源地址https://www.toymoban.com/news/detail-845460.html

到了这里,关于ES9学习 -- 对象的剩余参数与扩展运算符 / 正则扩展 / Promise.finally / 异步迭代的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ES6之 变量的解构赋值 ➕ 扩展运算符(…)

    一看就懂,代码如下: 效果如下: 如下: 如下: 什么是扩展运算符(…运算符)? 就是展开语法 (Spread syntax), 可以在函数调用/数组构造时,将数组表达式或者 string 在语法层面展开;还可以在构造字面量对象时,将对象表达式按 key-value 的方式展开。(译者注: 字面量一般指

    2024年02月09日
    浏览(45)
  • kotlin学习(二)泛型、函数、lambda、扩展、运算符重载

    Kotlin 中的类可以有类型参数,与 Java 类似: 创建这样类的实例只需要提供类型参数即可: 如果类型参数可以推断出来,例如从构造函数的参数或者从其他途径,就可以省略类型参数: String作为Object的子类,就可以直接将子类对象赋值给父类,这个操作即达到了 型变 。 但是

    2024年02月09日
    浏览(39)
  • 【React系列】ES6学习笔记(一)let与const、解构赋值、函数参数默认值\rest参数\箭头函数、数组和对象的扩展、Set和Map等

    本文参考自电子书《ECMAScript 6 入门》:https://es6.ruanyifeng.com/ 尽量使用 let 声明变量,而不是 var 。 let 声明的变量是 块级作用域 , var 声明的变量是 全局作用域 。 使用 let 变量 必须先声明再使用,否则报错,不存在变量提升 。相对的 var 声明的变量如果提前使用,不会报错

    2024年02月03日
    浏览(52)
  • 【C++学习】类和对象 | 拷贝构造 | 探索拷贝构造函数为什么需要引用传参 | 深拷贝 | 初识运算符重载

    上一篇文章我们开始学习类内的默认成员函数, 这里是传送门,有兴趣可以去看看:http://t.csdn.cn/iXdpH 这篇文章我们继续来学习类和对象的知识。 目录 写在前面: 1. 拷贝构造 2. 拷贝构造函数为什么需要引用传参? 3. 深拷贝 4. 初识运算符重载 写在最后: 我们在创建一个对

    2024年02月11日
    浏览(49)
  • C# 扩展运算符(...)的详细解析

    在C#编程中,扩展运算符(…)是一种非常有用的特性,它可以将一个数组或集合转换成一个可迭代的序列。扩展运算符在C# 7.0及以后的版本中引入,提供了一种简洁的方式来创建数组、列表或集合的实例,尤其是在需要传递多个参数时。本文将详细介绍C#扩展运算符的概念、

    2024年04月22日
    浏览(79)
  • js 扩展运算符(spread)是三个点(...)

    三个点的作用:将一个数组转为用逗号分隔的参数序列。

    2024年02月12日
    浏览(30)
  • 数论——中国剩余定理、扩展中国剩余定理 学习笔记

    中国剩余定理(Chinese Remainder Theorem,CRT) 求解如下形式的一元线性同余方程组(其中 (m) 两两互质): $left{begin{matrix}x equiv a_1 pmod {m_1} \\\\x equiv a_2 pmod {m_2} \\\\ dots \\\\x equiv a_k pmod {m_k}end{matrix}right.$ 计算所有模数的积 (M = prod m_i) ; 对于第 (i) 个方程: 计算: (M_i

    2024年02月08日
    浏览(37)
  • 【C++】STL 算法 ⑧ ( 预定义函数对象 | 预定义函数对象组成 | 预定义函数对象分类 | 预定义 算术运算符 函数对象 | 预定义 比较运算符 函数对象 | 预定义 逻辑运算符 函数对象 )

    C++ 的 标准模板库 ( STL , Standard Template Library ) 中 , 预定义了一系列的 \\\" 函数对象 “ , 又称为 ” 仿函数 Functors \\\" ; 这些 \\\" 预定义函数对象 \\\" 在 STL 算法中 , 可以 作为 算法的参数 , 定制某些参数的行为 , 如 : for_each 遍历算法中 , 传入 \\\" 一元函数对象 \\\" , 用于执行单个元素的遍历

    2024年01月16日
    浏览(67)
  • 「学习笔记」(扩展)中国剩余定理

    有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何? 该问题出自《孙子算经》,具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出: 三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。 (2 times 70 + 3 times 21 + 2 times

    2024年02月06日
    浏览(32)
  • 碰到es6的...拓展运算符

    第一次碰到,哥们啥也不会 let searchForm = ref({}) let formData = ref({}) const initArgs = async() = {     args.value= props.init_data     formData .value= {         ...searchForm.value,//把值都带过来         workWhere : args.value.workWhere,         statusArgs : args.value.status     } }

    2024年01月24日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包