广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >JavaScript中的File API、Streams API和Web Cryptography API是什么
  • 379
分享到

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

2024-04-02 19:04:59 379人浏览 泡泡鱼
摘要

今天小编给大家分享一下javascript中的File api、Streams API和WEB Cryptography API是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所

今天小编给大家分享一下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是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网node.js频道。

--结束END--

本文标题: JavaScript中的File API、Streams API和Web Cryptography API是什么

本文链接: https://www.lsjlt.com/news/97223.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中的File API、Streams API和Web Cryptography API是什么
    今天小编给大家分享一下JavaScript中的File API、Streams API和Web Cryptography API是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所...
    99+
    2022-10-19
  • JavaScript中api指的是什么
    这篇文章主要介绍了JavaScript中api指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 在Jav...
    99+
    2022-10-19
  • java中的api是什么
    什么是API?API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节...
    99+
    2021-07-26
    java入门 java api
  • HTML5中Javascript API 拖拽的属性是什么
    这期内容当中小编将会给大家带来有关HTML5中Javascript API 拖拽的属性是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 ...
    99+
    2022-10-19
  • html5中api指的是什么
    html5中api指的是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在html5中,api是“application programmi...
    99+
    2022-10-19
  • java中的时间API是什么
    这篇文章主要介绍“java中的时间API是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java中的时间API是什么”文章能帮助大家解决问题。1、Clock类可用于访问当前日期和时间。Clock...
    99+
    2023-06-30
  • rest api和restful的区别是什么
    REST(Representational State Transfer)是一种网络通信协议,用于构建分布式系统中的网络服务。RES...
    99+
    2023-10-08
    rest
  • 软件开发中的API和SDK是什么
    一、API的概念和功能 API(Application Programming Interface)是一组定义了软件组件之间交互规则的接口。它可以被视为一个桥梁,连接了不同的软件模块,允许它们相互通信和交互。API定义了调用者可以使用的方法...
    99+
    2023-10-29
    软件 API SDK
  • 什么是Python中的同步打包API?
    Python 中的同步打包 API 是一组可以让程序员将多个异步操作组合成一个同步操作的工具。这些 API 可以帮助程序员在使用异步编程时更加灵活和高效地控制程序的执行流程。 在 Python 中,异步编程是通过协程来实现的。协程是一种轻量...
    99+
    2023-09-18
    同步 打包 api
  • API在GO语言中的作用是什么?
    API,全称为“Application Programming Interface”,即应用程序编程接口,是一组预定义的函数和规则,用于访问操作系统、硬件或软件功能的一种方式。在GO语言中,API具有非常重要的作用,可以帮助开发者更方便地...
    99+
    2023-10-26
    linux windows api
  • PHP中的API是什么?如何使用它?
    API,全称Application Programming Interface,翻译为应用程序编程接口,是一组预定义的函数和方法,用于访问操作系统、应用程序或其他服务的功能和数据。在PHP中,API是非常重要的,因为它可以帮助开发人员创建...
    99+
    2023-07-02
    api bash 自然语言处理
  • PHP 中使用 JavaScript API 处理路径的最佳实践是什么?
    在开发 Web 应用程序时,PHP 和 JavaScript 是最常用的编程语言。PHP 通常用于处理服务器端的逻辑,而 JavaScript 用于处理客户端的交互和动态效果。在这两种编程语言中,处理路径是一个常见的需求。本文将介绍在 P...
    99+
    2023-11-10
    api javascript path
  • 什么是PHP中的API?如何使用它们?
    PHP是一种流行的服务器端编程语言,它可以被用来开发各种类型的Web应用程序。PHP中的API(Application Programming Interface)是一种特殊的接口,它允许开发人员通过代码与其他软件应用程序进行交互。在本文中...
    99+
    2023-09-18
    load 数据类型 api
  • 索引API在ASP和Laravel开发中的作用是什么?
    索引API是一种关键的技术,它在ASP和Laravel开发中扮演着非常重要的角色。它不仅可以提高应用程序的性能,还可以让应用程序更易于维护和扩展。本文将探讨索引API在ASP和Laravel开发中的作用,以及如何使用它来提高应用程序的性能...
    99+
    2023-09-21
    laravel 索引 api
  • Go 和 NumPy:打包 API 的最佳实践是什么?
    随着数据科学的不断发展,数据处理和分析的需求越来越高。而Go和NumPy是两个非常流行的工具,它们可以帮助我们完成数据处理和分析的任务。在本文中,我们将探讨如何使用Go和NumPy来打包API。 首先,我们需要了解什么是API。API代表应...
    99+
    2023-10-20
    打包 numy api
  • 探究API对象的奥秘:Python和Javascript有什么不同?
    API对象是现代编程中最为常见的对象之一,它们为开发者提供了一种访问和操作其他软件和服务的途径。在Web开发中,API对象被广泛应用,例如通过API对象来实现与社交媒体平台的交互、获取数据等。 Python和Javascript是两种非常流...
    99+
    2023-07-19
    javascript api 对象
  • PHP中的数据类型是什么?如何使用API和NPM?
    PHP是一门广泛应用于Web开发的脚本语言,它支持多种数据类型,如整型、浮点型、字符串、数组、对象等。在本文中,我们将介绍PHP中的数据类型及其用法,并探讨如何使用API和NPM。 一、PHP中的数据类型 整型 整型是指不带小数点的数...
    99+
    2023-09-14
    数据类型 api npm
  • PHP IDE 中的 API 实时监测功能是什么?
    PHP IDE 中的 API 实时监测功能是指一种能够帮助程序员在开发过程中实时检测 API 调用的工具。在 PHP 开发中,API 调用是一项非常重要的任务。而这一功能的引入,可以让程序员更加轻松地进行 API 调用的编写和调试。下面我们...
    99+
    2023-07-02
    ide api 实时
  • 了解ASP、Spring和Windows API的最佳实践是什么?
    在当今的软件开发领域,ASP、Spring和Windows API都是非常常见的技术。它们分别针对不同的应用场景,但是在实践中,我们需要遵循一些最佳实践,以确保我们的代码更加健壮、可维护和可扩展。在本文中,我们将介绍ASP、Spring和...
    99+
    2023-08-28
    spring windows api
  • Python API 数组同步的优势和劣势是什么?
    Python API(应用程序接口)是一种编程接口,它允许不同的软件之间进行交流和通信。Python API 数组同步是一种常用的数据处理方法,它可以在多个数组之间同步数据,从而提高数据处理的效率和精度。本文将介绍 Python API ...
    99+
    2023-08-17
    api 数组 同步
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作