中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript中的File API、Streams API和Web Cryptography API是什么

發布時間:2022-04-01 13:49:04 來源:億速云 閱讀:140 作者:iii 欄目:web開發

今天小編給大家分享一下JavaScript中的File API、Streams API和Web Cryptography API是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

JavaScript中的File API、Streams API和Web Cryptography API是什么

一、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()本地重排,但這個重排不會侵犯原子讀寫的邊界。

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]);
//2

3、原子交換

為了保證連續、不間斷的先讀后寫,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 API

Encoding API主要用于實現字符串與定型數組之間的轉換。

五、File API和Blob API

1、File類型

File API仍然以表單中的文件輸入字段為基礎,但是增加了直接訪問文件信息的能力。HTML5在DOM上為文件輸入元素增加了files集合。當用戶在文件字段中選擇一個或多個文件時,這個files集合中會包含一組File對象,表示被選中的文件,每個File對象都有一些只讀屬性。

2、FileReader類型

FileReader類型表示一種異步文件讀取機制,可以把FileReader想象成類似于XMLHttpRequest,只不過用于從文件系統讀取文件,而不是從服務器讀取數據。FileReader類型提供了幾個讀取文件數據的方法。

  • readAsText(file,encoding);//從文件中讀取純文本內容并保存在result屬性中

  • readAsDataURL(file);//讀取文件并將內容的數據URI保存在result屬性中

  • readAsBinaryString(file);//讀取文件并將每個字符的二進制數據保存在result屬性中

  • readAsArrayBuffer(file);//讀取文件并將文件內容以ArrayBuffer形式保存在result屬性中

3、FileReaderSync類型

FileReader類型的同步版本。

4、Blob與部分讀取

某些情況下,可能需要讀取部分文件而不是整個文件,為此,File對象提供了一個名為slice()的方法。slice()方法接收兩個參數:起始字節和堯都區的字節數。這個方法返回一個Blob的實例,而Blob實際上是File的超類。
blob表示二進制大對象,是JavaScript對不可修改二進制數據的封裝類型。包含字符串的數組、ArrayBuffers、ArrayBufferViews,甚至其他Blob都可以用來創建blob。Blob構造函數可以接收一個options參數,并在其中指定MIME類型。

六、Streams API

1、應用場景

Streams API 是為了解決一個簡單但又很基礎的問題而生的:Web應用如何消費有序的小信息塊而不是大塊信息?這種能力主要有兩種應用場景。

  1. 大塊數據可能不會一次性都可用。網絡請求的響應就是一個典型的例子。網絡負載是以連續信息包形式交付的,而流式處理可以讓應用在數據一到達就能使用,而不必等到所有數據都加載完畢。

  2. 大塊數據可能需要分小部分處理。視頻處理、數據壓縮、圖像編碼和JSON解析都是可以分成小部分進行處理,而不必等到所有數據都在內存中再處理的例子。

2、理解流

Streams API定義了三種流:

  • 可讀流:可以通過某個公共接口讀取數據塊的流。數據在內部從底層源進入流,然后由消費者consumer進行處理。

  • 可寫流:可以通過某個公共接口寫入數據塊的流。生產者(consumer)將數據寫入流,數據在內部傳入底層數據槽(sink)。

  • 轉換流:由兩種流組成,可寫流用于接收數據,可讀流用于輸出數據。這兩個流質檢是轉換程序(transformer),可以根據需要檢查和修改流內容。

七、Web Cryptography API

Web Cryptography API描述了一套密碼學工具,規范了JavaScript如何以安全和符合慣例的方式實現加密。這些工具包括生成、使用和應用加密秘鑰對,加密和解密信息,以及可靠地生成隨機數。

在需要生成隨機數時,很多人會使用Math.random()。這個方法在瀏覽器中是以偽隨機數生成器(PRNG,PseudoRandom Number Generator)方式實現的。所謂的偽指的是生成值的過程不是真的隨機。PRNG生成的值只是模擬了隨機的特性。瀏覽器的PRNG并未使用真正的隨機源,只是對一個內部狀態應用了固定的算法。每次調用Math.random(),這個內部狀態都會被一個算法修改,而結果會被轉換為一個新的隨機數。例如,V8引擎使用了一個名為xorshift128+的算法來執行這種修改。

由于算法本身是固定的,其輸入只是之前的狀態,因此隨機數順序也是確定的。xorshift128+使用128位內部狀態,而算法的設計讓任何初始狀態在重復自身之前都會產生2128-1個偽隨機值。這種循環被稱為置換循環,而這個循環的長度被稱為一個周期。很明顯,如果攻擊者知道PRNG的內部狀態,就可以預測后續生成的偽隨機值。如果開發者無意中使用了PRNG生成了私有密鑰用于加密,則攻擊者就可以利用PRNG的這個特性算出私有密鑰。

偽隨機數生成器主要用于快速計算出看起來隨機的數,不過并不適合用于加密算法,為解決這個問題,密碼學安全偽隨機數生成器(CSPRNG,Cryptographically Secure PseudoRandom Number Generator),額外增加了一個熵作為輸入,例如測試硬件時間或其它無法預計行為的系統特性,雖然速度上不及PRNG,但是生成的值更難預測了,就可以用于加密。

Web Cryptography API引入了CSPRNG,這個CSPRNG可以通過crypto.getRandomValues()在全局Crypto對象上訪問。與Math.random()返回一個0到1之間的浮點數不同,getRandomValues()會把隨機值寫入作為參數傳給它的定型數組。定型數組的類不重要,因為底層緩沖區會被隨機的二進制位填充。

以上就是“JavaScript中的File API、Streams API和Web Cryptography API是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

平武县| 普陀区| 淮北市| 泸州市| 永善县| 广丰县| 塔河县| 云南省| 临清市| 镇沅| 小金县| 牙克石市| 达日县| 慈溪市| 梧州市| 马公市| 武强县| 保康县| 梓潼县| 久治县| 北川| 吕梁市| 敖汉旗| 竹北市| 包头市| 巴彦县| 武乡县| 兰州市| 阿克| 通山县| 东丰县| 墨脱县| 鹤峰县| 河曲县| 五指山市| 江陵县| 甘谷县| 威海市| 西和县| 洪泽县| 重庆市|