溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-04-01 13:49:04 來(lái)源:億速云 閱讀:132 作者:iii 欄目:web開(kāi)發(fā)

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

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

一、Atomics和SharedArrayBuffer

多個(gè)上下文訪問(wèn)SharedArrayBuffer時(shí),如果同時(shí)對(duì)緩沖區(qū)執(zhí)行操作,就可能出現(xiàn)資源爭(zhēng)用問(wèn)題。Atomics API 通過(guò)強(qiáng)制同一時(shí)刻只能對(duì)緩沖區(qū)執(zhí)行一個(gè)操作,可以讓多個(gè)上下文安全地讀寫(xiě)一個(gè)SharedArrayBuffer。
原子操作的本質(zhì)會(huì)排斥操作系統(tǒng)或計(jì)算機(jī)硬件通常會(huì)自動(dòng)執(zhí)行的優(yōu)化(比如指令重新排序)。原子操作也讓并發(fā)訪問(wèn)內(nèi)存變得不可能,如果應(yīng)用不當(dāng)就可能導(dǎo)致程序執(zhí)行變慢,為此,Atomics API 的設(shè)計(jì)初衷是在最少但很穩(wěn)定的原子行為基礎(chǔ)上,構(gòu)建復(fù)雜的多線程JavaScript程序。

二、原子操作基礎(chǔ)

1、算術(shù)及位操作方法

Atomics API 提供了一套簡(jiǎn)單的方法用于執(zhí)行就地修改操作。在ECMA規(guī)范中,這些方法被定義為AtomicReadModifyWrite操作。在底層,這些方法都會(huì)從SharedArrayBuffer中某個(gè)位置讀取值,然后執(zhí)行算術(shù)和位操作,最后再把計(jì)算結(jié)果寫(xiě)到相同的位置。這些操作的原子本質(zhì)意味著上述讀取、修改、寫(xiě)回操作會(huì)按順序執(zhí)行,不會(huì)被其它線程中斷。

//創(chuàng)建大小為1的緩沖區(qū)let sharedArrayBuffer = new SharedArrayBuffer(1);
//基于緩沖創(chuàng)建Unit8Arraylet typedArray = new Unit8Array(sharedArrayBuffer);
//所有ArrayBuffer全部初始化為0console.log(typedArray);
//Unit8Array[0]
//對(duì)索引0處的值執(zhí)行原子加10Atomics.add(typedArray,0,10);
//Unit8Array[10]
//對(duì)索引0處的值執(zhí)行原子減10Atomics.sub(typedArray,0,10);
//Unit8Array[0]

2、原子讀和寫(xiě)

瀏覽器的JavaScript編譯器和CPU架構(gòu)本身都有權(quán)限重排指令以提升程序執(zhí)行效率。正常情況下,JavaScript的單線程環(huán)境是可以隨時(shí)進(jìn)行這種優(yōu)化的,但是,多線程中的指令重排可能導(dǎo)致資源爭(zhēng)用,而且極難排錯(cuò)。
Atomics API 通過(guò)兩種主要方式解決這個(gè)問(wèn)題:

  • 所有原子指令相互之間的順序永遠(yuǎn)不會(huì)重排。

  • 使用原子讀或原子寫(xiě)保證所有指令都不會(huì)相對(duì)原子讀寫(xiě)重新排序。

除了讀寫(xiě)緩沖區(qū)的值,Atomics.load()和Atomics.store()還可以構(gòu)建“代碼圍欄”。JavaScript引擎保證非原子指令可以相對(duì)于load()和store()本地重排,但這個(gè)重排不會(huì)侵犯原子讀寫(xiě)的邊界。

const sharedArrayBuffer = new SharedArrayBuffer(4);
const view = new Unit32Array(sharedArrayBuffer);
//執(zhí)行非原子寫(xiě)view[0] = 1;
//非原子寫(xiě)可以保證在這個(gè)讀操作之前完成,因此這里一定會(huì)讀到1console.log(Atomics.load(view,0));
//1
//執(zhí)行原子寫(xiě)Atomics.store(view,0,2);
//非原子讀可以保證在原子寫(xiě)完成后發(fā)生,這里一定會(huì)讀到2console.log(view[0]);
//2

3、原子交換

為了保證連續(xù)、不間斷的先讀后寫(xiě),Atomics API 提供了兩種方法:exchange()和compareExchange()。Atomics.exchange()執(zhí)行簡(jiǎn)單的交換,以保證其他線程不會(huì)中斷值得交換。

const sharedArrayBuffer = new SharedArrayBuffer(4);
const view = new Unit32Array(sharedArrayBuffer);
//在索引0處寫(xiě)入10Atomics.store(view,0,10);
//從索引0處讀取值,然后在索引0處寫(xiě)入5console.log(Atomics.exchange(view,0,5));
//10
//從索引0處讀取值console.log(Atomics.load(view,0));
//5

在多線程程序中,一個(gè)線程可能只希望在上次讀取某個(gè)值之后沒(méi)有其他線程修改該值得情況下對(duì)共享緩沖區(qū)執(zhí)行寫(xiě)操作。如果這個(gè)值沒(méi)有被修改,這個(gè)線程就可以安全地寫(xiě)入更新后的值:如果這個(gè)值被修改了,那么執(zhí)行寫(xiě)操作將會(huì)破壞其他線程計(jì)算的值。對(duì)于這種任務(wù),Atomics API提供了compare-Exchange()方法。這個(gè)方法只在目標(biāo)索引處的值與預(yù)期值匹配時(shí)才會(huì)執(zhí)行寫(xiě)操作。

4、原子Futex操作與加鎖

如果沒(méi)有某種鎖機(jī)制,多線程程序就無(wú)法支持復(fù)雜需求。為此,Atomics API提供了模仿Linux Futex(快速用戶空間互斥量,fast user-space mutex)的方法。這些方法本身雖然非常簡(jiǎn)單,但可以作為更復(fù)雜鎖機(jī)制的基本組件。
所有原子Futex操作只能用于Int32Array視圖,而且,只能用在工作線程內(nèi)部。

三、跨上下文消息

跨文檔消息,有時(shí)候也稱XDM(cross-document messaging),是一種在不同執(zhí)行上下文(例如不同工作線程或不同源的頁(yè)面)間傳遞信息的能力。

四、Encoding API

Encoding API主要用于實(shí)現(xiàn)字符串與定型數(shù)組之間的轉(zhuǎn)換。

五、File API和Blob API

1、File類型

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

2、FileReader類型

FileReader類型表示一種異步文件讀取機(jī)制,可以把FileReader想象成類似于XMLHttpRequest,只不過(guò)用于從文件系統(tǒng)讀取文件,而不是從服務(wù)器讀取數(shù)據(jù)。FileReader類型提供了幾個(gè)讀取文件數(shù)據(jù)的方法。

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

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

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

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

3、FileReaderSync類型

FileReader類型的同步版本。

4、Blob與部分讀取

某些情況下,可能需要讀取部分文件而不是整個(gè)文件,為此,F(xiàn)ile對(duì)象提供了一個(gè)名為slice()的方法。slice()方法接收兩個(gè)參數(shù):起始字節(jié)和堯都區(qū)的字節(jié)數(shù)。這個(gè)方法返回一個(gè)Blob的實(shí)例,而B(niǎo)lob實(shí)際上是File的超類。
blob表示二進(jìn)制大對(duì)象,是JavaScript對(duì)不可修改二進(jìn)制數(shù)據(jù)的封裝類型。包含字符串的數(shù)組、ArrayBuffers、ArrayBufferViews,甚至其他Blob都可以用來(lái)創(chuàng)建blob。Blob構(gòu)造函數(shù)可以接收一個(gè)options參數(shù),并在其中指定MIME類型。

六、Streams API

1、應(yīng)用場(chǎng)景

Streams API 是為了解決一個(gè)簡(jiǎn)單但又很基礎(chǔ)的問(wèn)題而生的:Web應(yīng)用如何消費(fèi)有序的小信息塊而不是大塊信息?這種能力主要有兩種應(yīng)用場(chǎng)景。

  1. 大塊數(shù)據(jù)可能不會(huì)一次性都可用。網(wǎng)絡(luò)請(qǐng)求的響應(yīng)就是一個(gè)典型的例子。網(wǎng)絡(luò)負(fù)載是以連續(xù)信息包形式交付的,而流式處理可以讓?xiě)?yīng)用在數(shù)據(jù)一到達(dá)就能使用,而不必等到所有數(shù)據(jù)都加載完畢。

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

2、理解流

Streams API定義了三種流:

  • 可讀流:可以通過(guò)某個(gè)公共接口讀取數(shù)據(jù)塊的流。數(shù)據(jù)在內(nèi)部從底層源進(jìn)入流,然后由消費(fèi)者consumer進(jìn)行處理。

  • 可寫(xiě)流:可以通過(guò)某個(gè)公共接口寫(xiě)入數(shù)據(jù)塊的流。生產(chǎn)者(consumer)將數(shù)據(jù)寫(xiě)入流,數(shù)據(jù)在內(nèi)部傳入底層數(shù)據(jù)槽(sink)。

  • 轉(zhuǎn)換流:由兩種流組成,可寫(xiě)流用于接收數(shù)據(jù),可讀流用于輸出數(shù)據(jù)。這兩個(gè)流質(zhì)檢是轉(zhuǎn)換程序(transformer),可以根據(jù)需要檢查和修改流內(nèi)容。

七、Web Cryptography API

Web Cryptography API描述了一套密碼學(xué)工具,規(guī)范了JavaScript如何以安全和符合慣例的方式實(shí)現(xiàn)加密。這些工具包括生成、使用和應(yīng)用加密秘鑰對(duì),加密和解密信息,以及可靠地生成隨機(jī)數(shù)。

在需要生成隨機(jī)數(shù)時(shí),很多人會(huì)使用Math.random()。這個(gè)方法在瀏覽器中是以偽隨機(jī)數(shù)生成器(PRNG,PseudoRandom Number Generator)方式實(shí)現(xiàn)的。所謂的偽指的是生成值的過(guò)程不是真的隨機(jī)。PRNG生成的值只是模擬了隨機(jī)的特性。瀏覽器的PRNG并未使用真正的隨機(jī)源,只是對(duì)一個(gè)內(nèi)部狀態(tài)應(yīng)用了固定的算法。每次調(diào)用Math.random(),這個(gè)內(nèi)部狀態(tài)都會(huì)被一個(gè)算法修改,而結(jié)果會(huì)被轉(zhuǎn)換為一個(gè)新的隨機(jī)數(shù)。例如,V8引擎使用了一個(gè)名為xorshift128+的算法來(lái)執(zhí)行這種修改。

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

偽隨機(jī)數(shù)生成器主要用于快速計(jì)算出看起來(lái)隨機(jī)的數(shù),不過(guò)并不適合用于加密算法,為解決這個(gè)問(wèn)題,密碼學(xué)安全偽隨機(jī)數(shù)生成器(CSPRNG,Cryptographically Secure PseudoRandom Number Generator),額外增加了一個(gè)熵作為輸入,例如測(cè)試硬件時(shí)間或其它無(wú)法預(yù)計(jì)行為的系統(tǒng)特性,雖然速度上不及PRNG,但是生成的值更難預(yù)測(cè)了,就可以用于加密。

Web Cryptography API引入了CSPRNG,這個(gè)CSPRNG可以通過(guò)crypto.getRandomValues()在全局Crypto對(duì)象上訪問(wèn)。與Math.random()返回一個(gè)0到1之間的浮點(diǎn)數(shù)不同,getRandomValues()會(huì)把隨機(jī)值寫(xiě)入作為參數(shù)傳給它的定型數(shù)組。定型數(shù)組的類不重要,因?yàn)榈讓泳彌_區(qū)會(huì)被隨機(jī)的二進(jìn)制位填充。

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

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI