带你学习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主要用于实现字符串与定型数组之间的转换 。

推荐阅读