成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

ES15 (2024)中5個令人驚嘆的新JavaScript特性

開發 前端
ES15對JavaScript來說是一個重大飛躍,包含了幾個對現代開發至關重要的特性。幫助你以更簡潔、更富表現力、更清晰的方式編寫更干凈的代碼。

2024年:又是一個帶來全新JS特性升級的不可思議的年份,ES15推出。

從復雜的異步特性到語法糖數組和現代正則表達式,JavaScript編碼現在比以往任何時候都更簡單、更快捷。

1.原生數組分組終于到來

Object.groupBy():

const fruits = [
  { name: 'pineapple??', color: '??' },
  { name: 'apple??', color: '??' },
  { name: 'banana??', color: '??' },
  { name: 'strawberry??', color: '??' },
];

const groupedByColor = Object.groupBy(
  fruits,
  (fruit, index) => fruit.color
);

// 原生 group by 示例
console.log(groupedByColor);

圖片圖片

字面意思就是讓恐龍級的 Lodash 庫失去了最后的存在理由 - 再也不需要了!

圖片圖片

我原本期待一個新的實例方法,比如Array.prototype.groupBy,但不知什么原因他們把它做成了靜態方法。

然后我們還有Map.groupBy來用對象鍵進行分組:

const array = [1, 2, 3, 4, 5];

const odd = { odd: true };
const even = { even: true };

Map.groupBy(array, (num, index) => {
  return num % 2 === 0 ? even : odd;
});
// => Map { {odd: true}: [1, 3, 5], {even: true}: [2, 4] }

不過幾乎沒人會這樣對數組分組,所以可能不會那么受歡迎。

2.從外部解決promise - 現代方式

使用Promise.withResolvers()。

從外部解決promises是很普遍的需求,在此之前我們不得不使用Deferred類來實現:

class Deferred {
  constructor() {
    this.promise = new Promise((resolve, reject) => {
      this.resolve = resolve;
      this.reject = reject;
    });
  }
}

const deferred = new Deferred();

deferred.resolve();

或者從NPM安裝 - 又多了一個依賴!

圖片圖片

但現在有了ES15的Promise.withResolvers():

const { promise, resolve, reject } = Promise.withResolvers();

看看我如何用它來快速地將事件流promise化 - await一個observable:

// data-fetcher.js
const { promise, resolve, reject } = Promise.withResolvers();

function startListening() {
    eventStream.on('data', (data) => {
        resolve(data);
    });
}

async function getData() {
    return await promise;
}

// client.js
const { startListening, getData } = require('./data-fetcher.js');
startListening();

// ? 監聽單個流事件
const data = await getData();

3. Buffer性能升級

Buffers是用來存儲應用程序生成的臨時數據的小型數據存儲。

它們使得在管道的各個階段之間傳輸和處理數據變得非常容易。

像這樣的管道:

  • 文件處理: 輸入文件 → buffer → 處理 → 新buffer → 輸出文件
  • 視頻流: 網絡響應 → buffer → 顯示視頻幀
  • 餐廳隊列: 接待顧客 → 隊列/buffer → 服務顧客
const fs = require('fs');
const { Transform } = require('stream');

const inputFile = 'input.txt';
const outputFile = 'output.txt';

const inputStream = fs.createReadStream(inputFile, 'utf-8');

const transformStream = new Transform({
    transform(chunk) {
        // ? 從緩沖區轉換塊
    },
});

const outputStream = fs.createWriteStream(outputFile);

// ? 開始管道
inputStream.pipe(transformStream).pipe(outputStream);

使用 buffers,每個階段可以以不同的速度獨立處理數據。

但是當通過管道移動的數據超過buffer容量時會發生什么?

以前我們必須將當前所有數據的buffer復制到一個更大的buffer中。

這對性能來說很糟糕,尤其是當管道中將有大量數據時。

ES15為我們提供了解決這個問題的方案:可調整大小的數組buffers。

const resizableBuffer = new ArrayBuffer(1024, {
    maxByteLength: 1024 ** 2,
});

// ? 調整大小到 2048 字節
resizableBuffer.resize(1024 * 2);

4.異步升級

Atomics.waitAsync(): ES2024中另一個強大的異步編碼特性:

它是當2個代理共享一個buffer時...

代理1"睡眠"并等待代理2完成任務。

當代理2完成時,它使用共享buffer作為通道進行通知。

const sharedBuffer = new SharedArrayBuffer(4096);

const bufferLocation = new Int32Array(sharedBuffer);

// 初始化緩沖區位置的初始值
bufferLocation[37] = 0x1330;

async function doStuff() {
    // ? agent 1:在共享緩沖區位置等待直到通知
    Atomics.waitAsync(bufferLocation, 37, 0x1330).then(
        (r) => { /* 處理到達 */ }
    );
}

function asyncTask() {
    // ? agent 2:在共享緩沖區位置通知
    const bufferLocation = new Int32Array(sharedBuffer);
    Atomics.notify(bufferLocation, 37);
}

如果你認為這類似于普通的async/await,你絕對是對的。

但最大的區別是:這2個代理可以存在于完全不同的代碼上下文中 - 它們只需要訪問相同的buffer。

而且:多個代理可以在不同時間訪問或等待共享buffer - 其中任何一個都可以通知"喚醒"所有其他代理。

這就像P2P網絡;而async/await更像是客戶端-服務器請求-響應模式。

const sharedBuffer = new SharedArrayBuffer(4096);

const bufferLocation = new Int32Array(sharedBuffer);

bufferLocation[37] = 0x1330;

// ? 從 postMessage() 接收到的共享緩沖區

const code = `
var ia = null;
onmessage = function (ev) {
    if (!ia) {
        postMessage("Aux worker is running");
        ia = new Int32Array(ev.data);
    }
    postMessage("Aux worker is sleeping for a little bit");
    setTimeout(function () { postMessage("Aux worker is waking"); Atomics.notify(ia, 37); }, 1000);
};`;

async function doStuff() {
    // ? agent 1:存在于 Worker 上下文中
    const worker = new Worker(
        'data:application/javascript,' + encodeURIComponent(code)
    );
    worker.onmessage = (event) => {
        // 記錄事件
    };
    worker.postMessage(sharedBuffer);
    Atomics.waitAsync(bufferLocation, 37, 0x1330).then(
        (r) => { /* 處理到達 */ }
    );
}

function asyncTask() {
    // ? agent 2:在共享緩沖區位置通知
    const bufferLocation = new Int32Array(sharedBuffer);
    Atomics.notify(bufferLocation, 37);
}

5.正則表達式v標志和集合操作

這是一個全新的特性,使正則表達式更加清晰和直觀。

使用表達式模式查找和操作復雜字符串 - 在集合操作的幫助下:

// A 和 B 是字符類,如 [a-z]

// 差異:匹配 A 但不匹配 B
[A--B]

// 交集:同時匹配 A 和 B
[A&&B]

// 嵌套字符類
[A--[0-9]]

匹配不斷增加的Unicode字符集,如:

  • 表情符號: ??, ??, ??, ??, 等
  • 重音字母: é, à, ?, ?, 等
  • 符號和非拉丁字符: ?, ?, €, £, μ, ¥, 等

所以這里我們使用Unicode正則表達式和v標志來匹配所有希臘字母:

const regex = /[\p{Script_Extensinotallow=Greek}&&\p{Letter}]/v;

最后的想法

總的來說,ES15對JavaScript來說是一個重大飛躍,包含了幾個對現代開發至關重要的特性。幫助你以更簡潔、更富表現力、更清晰的方式編寫更干凈的代碼。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2024-07-31 08:38:36

2011-04-07 11:33:00

HTML 5JavaScript

2011-03-18 09:56:19

JavaScript

2024-02-19 10:15:37

JavaScript正則表達式ECMAScript

2024-07-02 08:36:09

JavaScriptUnicode模式

2023-12-10 14:19:31

JupyterPython編碼

2025-03-04 10:03:47

2025-02-17 11:10:49

2020-02-19 14:47:25

人工智能技術無人駕駛

2020-11-10 07:11:23

Linux內核補丁

2020-12-22 15:47:02

Python開發工具

2012-03-01 11:32:18

硅谷女性

2012-11-15 09:59:35

HTML5WebHTML5特效

2024-05-31 11:32:32

2021-11-29 07:02:24

Python函數操作

2024-05-16 11:09:40

Python字符串代碼

2019-12-27 16:10:53

前端javascriptnode.js

2019-12-25 14:03:42

JavaScript開發

2019-12-25 09:00:00

JavascriptWeb前端

2022-03-23 15:11:04

Arch LinuxLinuxCutefish 桌
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧洲一区二区 | 五月天婷婷狠狠 | 狠狠亚洲 | 正在播放国产精品 | 久久精品91久久久久久再现 | 国产精品久久久久久久久久三级 | 欧美炮房 | 成人三级在线播放 | 欧美视频在线免费 | 免费av观看 | 成人av播放| 一级片免费视频 | 国产精品久久久久久婷婷天堂 | 亚洲欧美视频 | 国产精品揄拍一区二区 | 欧美h| 国产精品99久久久久久久久久久久 | 久久蜜桃av | 日韩av在线一区 | 国产一级久久久久 | 亚洲精品不卡 | 97福利在线| 成人一区二区三区 | 九九在线| 国产一区二区三区在线看 | 国产高清在线精品 | 免费视频一区 | 成人在线免费视频 | 日本 欧美 国产 | 精品视频在线免费观看 | 日韩在线观看网站 | 欧美精品成人 | 国产精品99久久免费观看 | 午夜视频在线免费观看 | a中文在线视频 | 久久精品小短片 | 欧美日韩黄色一级片 | 日本成人中文字幕 | 一区二区在线 | 亚洲精品一区二三区不卡 | 99久久99热这里只有精品 |