ES7、ES8 更新点梳理

ES7 和 ES8 出来的时间已经蛮长了,对于浏览器的支持也比较好,正巧昨天在调研如何优化 web-worker 的时候看到了一个新特性,顺便与大家分享一下,大佬勿喷

ES7

在 ES7 中,只新增了数组的 includes 和简写的位运算符,我来给大家举个例子吧

1.Array.prototype.includes(value, formIndex)

  • 该方法确定确定某一个值是否存在于当前数组中
参数
  • value: 需要查找的值

  • formIndex: 从指定位置开始查找

返回值
  • 返回值是一个 Boolean 值,true 代表包含,false 代表不包含
const arr = [1, 2, 3, NaN]

// 最简单使用

console.log(arr.includes(2)) // 返回 true
console.log(arr.includes(5)) // 返回 false
console.log(arr.includes(NaN)) // 返回 true

// 当我们知道查询的值大概范围时 (吐槽一下:一直觉得这个参数鸡肋的一批)

// formIndex > 数组长度
console.log(arr.includes(2,5)) // 返回 false

// formIndex < 0
console.log(arr.includes(2, -1)) // 返回 false
console.log(arr.includes(2, -3)) // 返回 true

注:这个地方有一个它内置的计算公示: arr.length + formIndex <= arr.length 如果上述条件满足,将从计算后的位置查询当前值,不满足的话,会从整个数组中查询

2.指数运算简写 **

  • 原来我们在计算 2 的 10 次方时,写法一般都是这样的
const num1 = Math.pow(2, 10)
  • 那其实我们现在可以这样去写
const num2 = 2 ** 10

// 验证一下是否相等
console.log(num1 === num2) // 返回 true
  • 这样去写的话,是不是又可以少写几个字母了~~

ES8

ES8 中我们现在用的最多的首当其冲是 async/await 了,那其实还有很多有意思的东西,我们可以看看

1.async/await

我们分开介绍吧

  • async 这个关键字可以将一个 function 声明成为一个异步方法,返回值是一个 Promise
async function getNumber(num) {
  return num + 10
}
// 同样的方法可以写成这样
const getNumber = async (num) => {
    return num + 10
}
console.log(getNumber(10)) // 返回 Promise {<fulfilled>: 20}

  • 如果返回值是一个 promise 的话,我们其实获取值也可以这样写
getNumber(10).then(res => console.log(res))
  • await 这个关键字和 async 一起使用的时候就体现出了优势。该关键字只能在 异步函数 中才会起作用
function promiseFn() {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve("result");
    }, 1500);
  });
}
async function fn() {
  let res = await promiseFn();
  console.log("异步代码执行完毕", res);
}
fn(); // wait 1.5s 后,打印 异步代码执行完毕, result

注:多个异步方法需要同时执行,可以使用 await Promise.all[promise1,promise2]

2.Object.values() 和 Object.entries()

  • Object.values() 方法返回一个给定对象自身所有的 key,其中是不包含继承来的 key

  • Object.entries() 方法返回一个数组,包含当前Object中自身所有键值对,同样不包含继承来的值

const obj = { name: 'tal', age: 17 };

console.log(Object.values(obj)); //返回 ['tal', 17]

console.log(Object.entries(obj)); //返回  [['name', 'tal'],['age', 17]]

// 其实对于我们平常开发来说,还是提高了一些效率的
// 例如:遍历对象的键值
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key}-${value}`);
});


// 如果传入的是字符串会怎样
Object.values('tal') //返回 ["t", "a", "l"]
Object.entries('tal') // 返回 [['0': 't'], ['1': 'a'], ['2': 'l']]

注: 在使用这两个属性时,会发生一个隐式的类型转化,将我们传入的值转为 Object 后,再执行方法

3.String padding

String 新增了两个实例函数 String.prototype.padStartString.prototype.padEnd ,允许将空字符串或其他字符串添加到原始字符串的开头或结尾。

参数
  • targetLength: 当前字符串需要填充到的目标长度。如果这个数值小于当前字符串的长度,则返回当前字符串本身。
  • padString: (可选)填充字符串。如果字符串太长,使填充后的字符串长度超过了目标长度,则只保留最左侧的部分,其他部分会被截断,此参数的缺省值为 ' '。
// 简单写法
console.log('0.0'.padStart(4,'10')) //返回 10.0
console.log('0.0'.padEnd(4,'0')) //返回 0.00 
   
console.log('0.0'.padStart(20)) //返回 0.00    
console.log('0.0'.padEnd(10,'0')) //返回 0.00000000

4.结尾支持逗号

这个功能其实对于我们来说还是比较友好的

例如:一个方法或者对象,我们只是增加了一个属性或者参数,我们需要在最末尾先增加一个逗号后再添加新属性或者参数,这样的话,在 git 上就会出现两行改动,不是很友好

function fn(
    para1: number,
    para: number,
){
    console.log(para1,para);
}
fn(1,2);

let obj = {
    n:'',
    n:'',
}

在支持这样的语法后,我们就可以改一下我们的格式化工具了,避免了提交中会多出的一些改动

5.Object.getOwnPropertyDescriptors()

该函数函数用来获取一个对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。

const obj = {
  name: "tal",
  get fn() {
    return "fn";
  }
};

const obj1 = {}
console.log(Object.getOwnPropertyDescriptors(obj1))
console.log(Object.getOwnPropertyDescriptors(obj))
  1. SharedArrayBuffer 与 Atomics

整个梳理了一遍 ES7 和 ES8 的东西后,终于开始聊重头戏了,在用 web-worker 的老师们,可以看看这个东西是不是正好满足了你当前的需求

是不是还在为 worker 线程不能直接获取到主线程的变量而苦恼
是不是还在频繁的使用 postMessage 而感到繁琐
尝试一下 SharedArrayBuffer 吧(好像一段广告词...)

直接上代码

// 这里是主进程代码
// 创建一个worker进程
const worker = new Worker("./worker.js");

// 新建1kb内存
const sharedBuffer = new SharedArrayBuffer(1024);

//  建视图
const intArrBuffer = new Int32Array(sharedBuffer);

for (let i = 0; i < intArrBuffer.length; i++) {
  intArrBuffer[i] = i;
}
// console.log(sharedBuffer);
// postMessage  发送的共享内存地址
worker.postMessage(intArrBuffer);

worker.onmessage = function(e) {
  console.log("更改后的数据", Atomics.load(intArrBuffer, 20)); // 返回 99
};
// 这里是 worker 的代码
onmessage = function(e) {
  let arrBuffer = e.data; // 这里就可以获取到
  console.log(Atomics.load(arrBuffer, 20))
  // 我们改一下它
  Atomics.store(arrBuffer, 20, 99); // 返回 99
};

这段代码实际就是在内存中创建了一个 1kb 的内存,然后我将其中的内容循环改成数字后,发送给子进程(还是需要 PostMessage )的,但是内存中的读写速度要比使用 PostMessage 快了很多,感兴趣的老师可以试试

SharedArrayBuffer 是 js 开启多线程的第一步,一提到多线程,我们一定会想到竞争,同样的去修改同一个变量下的同一个元素怎么办?答:多个共享内存的线程能够同时读写同一位置上的数据。原子操作会确保正在读或写的数据的值是符合预期的,即下一个原子操作一定会在上一个原子操作结束后才会开始,其操作过程不会中断。

这个时候就出现了 Atomics, 它对象提供了一组静态方法用来对 SharedArrayBuffer 对象进行原子操作。这些原子操作属于 Atomics 模块。与一般的全局对象不同,Atomics 不是构造函数,因此不能使用 new 操作符调用,也不能将其当作函数直接调用。Atomics 的所有属性和方法都是静态的。

我们来看看它有什么方法:

  • Atomics.add() 将指定位置上的数组元素与给定的值相加,并返回相加前的值
  • Atomics.and() 将指定位置上的数组元素与给定的值相与,返回操作前的值
  • Atomics.load() 返回数组中指定位置的值
  • Atomics.store() 改动其中的某个值,并返回改动后的值
  • Atomics.wait() 如果当前的值等于给定的值,线程会被阻塞等待
  • Atomics.notify() 将当前等待的进程唤醒
    ...

它提供的方法还是很多的,剩下的留给大佬们自己实践一下(测试的时候需要启动服务哈,worke需要)...

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280