帶你學習JavaScript中的File API、Streams API和Web Cryptography API

本篇文章給大家帶來了關于javascript的相關知識 , 其中主要介紹了JavaScript中的File API、Streams API、Web Cryptography API的相關內容 , 希望對大家有幫助 。

帶你學習JavaScript中的File API、Streams API和Web Cryptography API

文章插圖

【相關推薦:javascript視頻教程】
一、Atomics和SharedArrayBuffer多個上下文訪問SharedArrayBuffer時 , 如果同時對緩沖區執行操作 , 就可能出現資源爭用問題 。 Atomics API 通過強制同一時刻只能對緩沖區執行一個操作 , 可以讓多個上下文安全地讀寫一個SharedArrayBuffer 。
原子操作的本質會排斥操作系統或計算機硬件通常會自動執行的優化(比如指令重新排序) 。 原子操作也讓并發訪問內存變得不可能 , 如果應用不當就可能導致程序執行變慢 , 為此 , Atomics API 的設計初衷是在最少但很穩定的原子行為基礎上 , 構建復雜的多線程JavaScript程序 。
二、原子操作基礎1、算術及位操作方法Atomics API 提供了一套簡單的方法用于執行就地修改操作 。 在ECMA規范中 , 這些方法被定義為AtomicReadModifyWrite操作 。 在底層 , 這些方法都會從SharedArrayBuffer中某個位置讀取值 , 然后執行算術和位操作 , 最后再把計算結果寫到相同的位置 。 這些操作的原子本質意味著上述讀取、修改、寫回操作會按順序執行 , 不會被其它線程中斷 。
//創建大小為1的緩沖區let sharedArrayBuffer = new SharedArrayBuffer(1);//基于緩沖創建Unit8Arraylet typedArray = new Unit8Array(sharedArrayBuffer);//所有ArrayBuffer全部初始化為0console.log(typedArray);//Unit8Array[0]//對索引0處的值執行原子加10Atomics.add(typedArray,0,10);//Unit8Array[10]//對索引0處的值執行原子減10Atomics.sub(typedArray,0,10);//Unit8Array[0]2、原子讀和寫瀏覽器的JavaScript編譯器和CPU架構本身都有權限重排指令以提升程序執行效率 。 正常情況下 , JavaScript的單線程環境是可以隨時進行這種優化的 , 但是 , 多線程中的指令重排可能導致資源爭用 , 而且極難排錯 。
Atomics API 通過兩種主要方式解決這個問題:
    所有原子指令相互之間的順序永遠不會重排 。
    使用原子讀或原子寫保證所有指令都不會相對原子讀寫重新排序 。
除了讀寫緩沖區的值 , Atomics.load()和Atomics.store()還可以構建“代碼圍欄” 。 JavaScript引擎保證非原子指令可以相對于load()和store()本地重排 , 但這個重排不會侵犯原子讀寫的邊界 。
【帶你學習JavaScript中的File API、Streams API和Web Cryptography API】const sharedArrayBuffer = new SharedArrayBuffer(4);const view = new Unit32Array(sharedArrayBuffer);//執行非原子寫view[0] = 1;//非原子寫可以保證在這個讀操作之前完成 , 因此這里一定會讀到1console.log(Atomics.load(view,0));//1//執行原子寫Atomics.store(view,0,2);//非原子讀可以保證在原子寫完成后發生 , 這里一定會讀到2console.log(view[0]);//23、原子交換為了保證連續、不間斷的先讀后寫 , Atomics API 提供了兩種方法:exchange()和compareExchange() 。 Atomics.exchange()執行簡單的交換 , 以保證其他線程不會中斷值得交換 。
const sharedArrayBuffer = new SharedArrayBuffer(4);const view = new Unit32Array(sharedArrayBuffer);//在索引0處寫入10Atomics.store(view,0,10);//從索引0處讀取值 , 然后在索引0處寫入5console.log(Atomics.exchange(view,0,5));//10//從索引0處讀取值console.log(Atomics.load(view,0));//5在多線程程序中 , 一個線程可能只希望在上次讀取某個值之后沒有其他線程修改該值得情況下對共享緩沖區執行寫操作 。 如果這個值沒有被修改 , 這個線程就可以安全地寫入更新后的值:如果這個值被修改了 , 那么執行寫操作將會破壞其他線程計算的值 。 對于這種任務 , Atomics API提供了compare-Exchange()方法 。 這個方法只在目標索引處的值與預期值匹配時才會執行寫操作 。
4、原子Futex操作與加鎖如果沒有某種鎖機制 , 多線程程序就無法支持復雜需求 。 為此 , Atomics API提供了模仿Linux Futex(快速用戶空間互斥量 , fast user-space mutex)的方法 。 這些方法本身雖然非常簡單 , 但可以作為更復雜鎖機制的基本組件 。
所有原子Futex操作只能用于Int32Array視圖 , 而且 , 只能用在工作線程內部 。
三、跨上下文消息跨文檔消息 , 有時候也稱XDM(cross-document messaging) , 是一種在不同執行上下文(例如不同工作線程或不同源的頁面)間傳遞信息的能力 。
四、Encoding APIEncoding API主要用于實現字符串與定型數組之間的轉換 。

推薦閱讀