首页 > 其他分享 >复习ES(6-11)语法之ES9

复习ES(6-11)语法之ES9

时间:2023-07-10 21:45:59浏览次数:36  
标签:11 const log age ES9 test console reg ES

目录

异步迭代

  • for-await-of
  • Symbol.asyncIterator

for...of循环用于遍历同步的 Iterator 接口。

function getPromise(time) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({
        value: time,
        done: false,
      });
    }, time);
  });
}
const arr = [getPromise(1000), getPromise(2000), getPromise(3000)];
for (let item of arr) {
  console.log(item); // 状态都是pending Promise { <pending> }
}

新引入的for await...of循环,则是用于遍历异步的 Iterator 接口。Symbol.asyncIterator依然遵守迭代器协议

arr[Symbol.asyncIterator] = function () {
  let nextIndex = 0;
  return {
    next() {
      return nextIndex < arr.length
        ? arr[nextIndex++]
        : Promise.resolve({
            value: undefined,
            done: true,
          });
    },
  };
};
async function test() {
  for await (let item of arr) {
    console.log(item); // 状态都是pending Promise { <pending> }
  }
}
test();

正则表达式扩展

  • dotAll

正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是有两个例外。一个是四个字节的 UTF-16 字符,这个可以用u修饰符解决;另一个是行终止符

所谓行终止符,就是该字符表示一行的终结。以下四个字符属于“行终止符”。

  • U+000A 换行符(\n
  • U+000D 回车符(\r
  • U+2028 行分隔符(line separator)
  • U+2029 段分隔符(paragraph separator)
const reg = /./;
console.log(reg.test("5")); // true
console.log(reg.test("x")); // true
console.log(reg.test("\n")); // false
console.log(reg.test("\r")); // false
console.log(reg.test("\u{2028}")); // false

ES2018 引入s修饰符,使得.可以匹配任意单个字符。这被称为dotAll模式,即点(dot)代表一切字符。

const reg = /./s;
console.log(reg.test("5")); // true
console.log(reg.test("x")); // true
console.log(reg.test("\n")); // true
console.log(reg.test("\r")); // true
console.log(reg.test("\u{2028}")); // true

所以,正则表达式还引入了一个dotAll属性,返回一个布尔值,表示该正则表达式是否处在dotAll模式。

const reg = /./;
console.log(reg.dotAll); // false


const reg = /./s;
console.log(reg.dotAll); // true
  • 具名组分配

正则表达式使用圆括号进行组匹配。正则表达式里面有三组圆括号。使用exec方法,就可以将这三组匹配结果提取出来。

const date = /(\d{4})-(\d{2})-(\d{2})/.exec("2023-07-10");
console.log(date);
console.log(date[1]);
console.log(date[2]);
console.log(date[3]);

ES2018 引入了具名组匹配,允许为每一个组匹配指定一个名字,既便于阅读代码,又便于引用。

“具名组匹配”在圆括号内部,模式的头部添加“问号 + 尖括号 + 组名”,然后就可以在exec方法返回结果的groups属性上引用该组名。

const date = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/.exec("2023-07-10");
console.log(date.groups.year);
console.log(date.groups.month);
console.log(date.groups.day);
  • 后行断言

“先行断言”指的是,x只有在y前面才匹配,必须写成/x(?=y)/

“先行否定断言”指的是,x只有不在y前面才匹配,必须写成/x(?!y)/

const str = "zzzapple";
console.log(str.match(/zzz(?=apple)/));
console.log(str.match(/zzz(?=banana)/)); // null
console.log(str.match(/zzz(?!banana)/));

“后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/

“后行否定断言”则与“先行否定断言”相反,x只有不在y后面才匹配,必须写成/(?<!y)x/

console.log(str.match(/(?<=zzz)apple/));
console.log(str.match(/(?<=zzz)banana/)); // null
console.log(str.match(/(?<!zzz)apple/)); // null

对象扩展

对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,不是引用而是真正拷贝到当前对象之中。

const obj1 = {
  name: "zzz",
};
const obj2 = {
  age: 18,
};
const obj = {
  ...obj1,
  ...obj2,
};
console.log(obj); // { name: 'zzz', age: 18 }
obj.age = 22;
console.log(obj2.age); // 18

如果合并2个对象有相同属性,后者属性会取代前者。

const obj1 = {
  name: "zzz",
  age: 34,
};
const obj2 = {
  age: 18,
};
const obj = {
  ...obj1,
  ...obj2,
};
console.log(obj); // { name: 'zzz', age: 18 }

可以通过rest参数提取对象中的属性

const obj = {
  name: "zzz",
  age: 18,
  lang: "zh-CN",
};
const { name, ...rest } = obj;
console.log(name); // zzz
console.log(rest); // { age: 18, lang: 'zh-CN' }

Promise.prototype.finally()

finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve("success");
    // reject('fail')
  }, 1000);
})
  .then((res) => {
    console.log(res);
  })
  .catch((err) => {
    console.log(err);
  })
  .finally(() => {
    console.log("finally");
  });

放松模板字符串文字限制

const foo = (arg) => {
  console.log(arg);
};
foo`\u{61} and \unicode`;

ES2018 放松了对标签模板里面的字符串转义的限制。如果遇到不合法的字符串转义,就返回undefined,而不是报错,并且从raw属性上面可以得到原始字符串。

标签:11,const,log,age,ES9,test,console,reg,ES
From: https://www.cnblogs.com/Small-Windmill/p/17542406.html

相关文章

  • 复习ES(6-11)语法之ES11
    目录String.prototype.matchAll()按需导入新的原始数据类型:BigIntPromise扩展globalThis可选链空值合并运算符String.prototype.matchAll()conststr=`<html><body><div>这是第一个div</div><p>我是p</p><......
  • 复习ES(6-11)语法之ES10
    目录Object.fromEntries()字符串扩展数组扩展JSON扩展Symbol.prototype.description()Object.fromEntries()Object.entries()返回一个给定对象自身可枚举属性的键值对数组。Object.fromEntries()方法是Object.entries()的逆操作,用于将一个键值对数组转为对象......
  • 爬虫学习02 requests高级用法
    1requests高级用法1.0自动携带cookie的session对象#session对象----》已经模拟登录上了一些网站---》单独把cookie取出来-res.cookies是cookiejar对象,里面有get_dict()方法转换成字典-转成字典res.cookies.get_dict()#使用session发送请求,cookie自动携带sess......
  • [Leetcode Weekly Contest]351
    链接:LeetCode[Leetcode]6451.找出最大的可达成数字给你两个整数num和t。如果整数x可以在执行下述操作不超过t次的情况下变为与num相等,则称其为可达成数字:每次操作将x的值增加或减少1,同时可以选择将num的值增加或减少1。返回所有可达成数字中的最大值......
  • 7.10 requests的高级使用
    1. 自动携带cookie和session对象header={'Referer':'http://www.aa7a.cn/user.php?&ref=http%3A%2F%2Fwww.aa7a.cn%2F','User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/114......
  • Ubuntu12.04 交叉编译 opencv-2.4.11过程
    1.Ubuntu换源可换源有很多,不过要下载12.04版的,好像不多。1.1先备份源sudocp/etc/apt/sources.list/etc/apt/sources.list.backup1.2由于12.04不受支持了,12.04相关的这些包的资源被移到了old-releases.ubuntu.com域名下:sudogedit/etc/apt/sources.list将下面内容插入......
  • CODE FESTIVAL 2017 Final J 题解
    problem&blog。萌萌点分治,积累个trick/qq。对于完全图\((V,E)\),将\(E\)分成\(E_1,E_2,\cdots,E_k\)(\(E_1\cupE_2\cup\cdots\cupE_k=E\))。对每个边集求MST,得到新边集\(E_1^{'},E_2^{'},\cdots,E_k^{'}\),再求MST。最终剩下的边集,等同于原边集的MST。......
  • 20230710-20230711 数论
    数论被薄纱了/kk授课老师:南京大学-朱富海教授20230710裴蜀定理对于给定不全为零的整数的\(a,b\)一定存在一对整数\(x,y\)满足\(ax+by=gcd(a,b)\)。证明:\(a==0\)\(or\)\(b==0\)显然成立;设\(gcd(a,b)=d\),即求证存在\(x,y\)满足\(ax+by=d\),等式两边同时除......
  • 【计数,DP】CF1081G Mergesort Strikes Back
    ProblemLink现有一归并排序算法,但是算法很天才,设了个递归深度上限,如果递归深度到达\(k\)则立即返回。其它部分都和正常归并排序一样,递归中点是\(\lfloor(l+r)/2\rfloor\),归并每次取两边较小者加入结果。给定\(n,k\),求用这个算法对一个均匀随机的排列\(p\)排序后,\(p\)......
  • Linux 内核0.11 系统调用详解(上)
    备注:本文通过三个问题,引出Linux内核0.11的系统调用。操作系统为什么要引出系统调用?回答这个问题前,请先参看如下图:由图可以看出,从操作系统的角度来看,一台计算机主要分为两级:用户级以及内核级,系统调用主要作用就是连接用户级和内核级的“插座”。上层用户的许多对计算机硬件的操作,......