iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >JavaScript中ArrayBuffer怎么用
  • 563
分享到

JavaScript中ArrayBuffer怎么用

2023-06-27 12:06:17 563人浏览 薄情痞子
摘要

本文小编为大家详细介绍“javascript中ArrayBuffer怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中ArrayBuffer怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知

本文小编为大家详细介绍“javascript中ArrayBuffer怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中ArrayBuffer怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

JavaScript中ArrayBuffer怎么用

一、Array 在内存中的堆栈模型

1. Array 的获取

Javascript 中如何产生 Array:

[element0, element1, ..., elementN]new Array(element0, element1, ..., elementN)new Array(arrayLength)

直接定义,或者通过构造函数创建一个 Array,当然也可以使用其他的手段:

"array".split("");"array".match(/a|r/g);

等等,方式有很多。但是 Array 内部是个什么样的结构,恐怕很多人还不是很清楚。

2. 堆栈模型

数组中我们可以放很多不同数据类型的数据,如:

var arr = [21, "李靖", new Date(), function(){}, , null];

上面这个数组中一次放入了 数字、字符串、对象、函数、undefined 和 null,对于上面的数据接口我们可以具象的描述下:

   栈+---------+                  堆|   21    |         +-------------------++---------+         |                   ||  "李靖" |         |                   |+---------+         |  +--------+       || [refer] |----------->| Object |       |+---------+         |  +--------+       || [refer] |----------------->+--------+ |+---------+         |        |function| ||undefined|         |        +--------+ |+---------+         |                   ||   null  |         +-------------------++---------+         Created By Barret Lee

JavaScript 的数据类型分为两种,一种是值类型,一种是引用类型,常见的引用类型有 Object 和 Array,数组的储存模型中,如果是诸如 Number、String 之类的值类型数据会被直接压入栈中,而引用类型只会压入对该值的一个索引,用 C 语言的概念来解释就是只保存了数据的指针,这些数据是储存在堆中的某块区间中。栈堆并不是独立的,栈也可以在堆中存放。

好了,对 Array 的说明就到这里,下面具体说说 ArrayBuffer 的相关知识。

二、ArrayBuffer

WEB 是个啥玩意儿,web 要讨论的最基本问题是什么?我觉得有两点,一个是数据,一个是数据传输,至于数据的展示,纷繁复杂,这个应该是 web 上层的东西。而本文要讨论的 ArrayBuffer 就是最基础的数据类型,甚至不能称之为数据类型,它是一个数据容易,需要通过其他方式来读写。

官方点的定义:

The ArrayBuffer is a data type that is used to represent a generic, fixed-length binary data buffer. You can’t directly manipulate the contents of an ArrayBuffer; instead, you create an ArrayBufferView object which represents the buffer in a specific fORMat, and use that to read and write the contents of the buffer. 表示二进制数据的原始缓冲区,该缓冲区用于存储各种类型化数组的数据。 无法直接读取或写入 ArrayBuffer,但可根据需要将其传递到类型化数组或 DataView 对象 来解释原始缓冲区。

他是一个二进制数据的原始缓冲区,虽然 JavaScript 是弱类型语言,但是他本身是对数据的类型和大小都有限制的,我们需要通过某种数据结构将缓冲区的内容有序的读取出来(写进去)。

1. 原始缓冲区的创建

通过 ArrayBuffer 这个构造函数可以创建一个原始缓冲区:

var buffer  = new ArrayBuffer(30);

从 chrome 控制台可以看到:

buffer 实例拥有一个 byteLength 的属性,用于获取 buffer 的 size,一个只有 IE11+ 以及 iOS6+ 支持的 slice 方法,用于对 buffer 长度进行截取操作。

ArrayBuffer slice(   unsigned long begin   unsigned long end Optional);

可以测试这个 DEMO:

var buffer = new ArrayBuffer(12);var x = new Int32Array(buffer);x[1] = 1234;var slice = buffer.slice(4);var y = new Int32Array(slice);console.log(x[1]);console.log(y[0]);x[1] = 6789;console.log(x[1]);console.log(y[0]);

2. 类型化数组

类型化数组类型表示可编制索引和操纵的 ArrayBuffer 对象 的各种视图。 所有数组类型的长度均固定。

名称大小(以字节为单位)描述
Int8Array18 位二补码有符号整数
Uint8Array18 位无符号整数
Int16Array216 位二补码有符号整数
Uint16Array216 位无符号整数
Int32Array432 位二补码有符号整数
Uint32Array432 位无符号整数
Float32Array432 位 IEEE 浮点数
Float64Array864 位 IEEE 浮点数

Int 就是整型,Uint 为无符号整形,Float 为浮点型,这些是 C 语言中的基本概念,我就不具体解释了。由于这些视图化结构都是大同小异,本文只对 Float32Array 类型作说明,读者可以举一反三。 Float32Array 跟 Array 是十分类似的,只不过他每一个元素都是都是一个 32位(4字节) 的浮点型数据。Float32Array 一旦创建其大小不能再修改。 我们可以直接创建一个 Float32Array:

var x = new Float32Array(2);x[0] = 17;console.log(x[0]); // 17console.log(x[1]); // 0console.log(x.length); // 2

需要有这么一个概念,他依然是一个数组,只不过该数组中的每个元素都是 Float 32 位的数据类型,再如:

var x = new Float32Array([17, -45.3]);console.log(x[0]);  // 17console.log(x[1]);  // -45.29999923706055console.log(x.length); // 2

我们把一个数组的值直接赋给了 x 这个 Float32Array 对象,那么在储存之前会将它转换成一个 32位浮点数。 由于该类数组的每个元素都是同一类型,所以在堆栈模型中,他们全部会被压入到栈之中,因此类型化数组都是值类型,他并不是引用类型!这个要引起注意,从下面的例子中也可以反映出来:

var x = new Float32Array([17, -45.3]);var y = new Float32Array(x);console.log(x[0]); // 17console.log(x[1]); //-45.29999923706055console.log(x.length); // 2x[0] = -2;console.log(y[0]); // 17, y的值没变

将 x 的值复制给 y,修改 x[0], y[0] 并没有变化。 除了上面的方式,我们还可以通过其他方式来创建一个类型化数组:

var buffer = new ArrayBuffer(12);var x = new Float32Array(buffer, 0, 2);var y = new Float32Array(buffer, 4, 1);x[1] = 7;console.log(y[0]); // 7

解释下这里为什么返回 7.

     ArrayBuffer(12)+-+-+-+-+-+-+-+-+-+-+-+-+-+|0|1|2|3|4|5|6|7|8| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+\              /           x (Float32Array) offset:0 byteLength:4 length:2      ArrayBuffer(12)+-+-+-+-+-+-+-+-+-+-+-+-+-+|0|1|2|3|4|5|6|7|8| | | | |+-+-+-+-+-+-+-+-+-+-+-+-+-+       \       /                      y

看了上面的图解还有疑问么?我觉得我不用继续解释了。可以把 ArrayBuffer 的单位看成 1,而 Float32Array 的单位是 4.

3. DataView对象

DataView 对象对数据的操作更加细致,不过我觉得没啥意思,上面提到的各种类型化数组已经可以基本满足应用了,所以这里就一笔带过,一个简单的示例:

var buffer = new ArrayBuffer(12);var x = new DataView(buffer, 0);x.setInt8(0, 22);x.setFloat32(1, Math.PI);console.log(x.getInt8(0)); // 22console.log(x.getFloat32(1)); // 3.1415927410125732
JavaScript中ArrayBuffer怎么用

三、XHR2 中的 ArrayBuffer

ArrayBuffer 的应用特别广泛,无论是 websocket、WebAudio 还是 ajax等等,前端方面只要是处理大数据或者想提高数据处理性能,那一定是少不了 ArrayBuffer 。
XHR2 并不是什么新东西,可能你用到了相关的特性,却不知这就是 XHR2 的内容。最主要的一个东西就是 “xhr.responseType”,他的作用是设置响应的数据格式,可选参数有:”text”、”arraybuffer”、”blob”或”document”。请注意,设置(或忽略)xhr.responseType = ” 会默认将响应设为”text”。这里存在一个这样的对应关系:

请求            响应text            DOMStringarraybuffer     ArrayBufferblob            Blobdocument        Document

举个例子:

var xhr = new XMLHttpRequest();xhr.open('GET', '/path/to/image.png', true);xhr.responseType = 'arraybuffer';xhr.onload = function(e) {    // this.response == uInt8Array.buffer    var uInt8Array = new Uint8Array(this.response); };xhr.send();

我们在 xhr.responseType 中设置了属性为 arraybuffer,那么在拿到的数据中就可以用类型化数组来接受啦!

读到这里,这篇“JavaScript中ArrayBuffer怎么用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: JavaScript中ArrayBuffer怎么用

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

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

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

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

下载Word文档
猜你喜欢
  • JavaScript中ArrayBuffer怎么用
    本文小编为大家详细介绍“JavaScript中ArrayBuffer怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript中ArrayBuffer怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
    99+
    2023-06-27
  • JavaScript中this怎么用
    这篇文章主要介绍JavaScript中this怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!this是面向对象语言中一个重要的关键字,理解并掌握该关键字的使用对于我们代码的健壮...
    99+
    2024-04-02
  • javascript中.toggleClass()怎么用
    这篇文章主要介绍javascript中.toggleClass()怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   如果匹配元素的父级元素有bar样式类名,这个例子将为&l...
    99+
    2024-04-02
  • JavaScript中JSON怎么用
    这篇文章主要为大家展示了“JavaScript中JSON怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中JSON怎么用”这篇文章吧。J...
    99+
    2024-04-02
  • JavaScript中map()怎么用
    这篇文章主要介绍了JavaScript中map()怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。map()map() 方法创建一个新数组,其结果是该数组中的每个元素是调...
    99+
    2023-06-27
  • javascript中bind怎么用
    这篇文章给大家分享的是有关javascript中bind怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 javascript中bind方法用于创...
    99+
    2024-04-02
  • javascript中hover怎么用
    这篇文章主要介绍javascript中hover怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在JavaScript中,hover()方法用于规定...
    99+
    2024-04-02
  • JavaScript中promisify怎么用
    这篇文章将为大家详细讲解有关JavaScript中promisify怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。promisify使用方法:promisify 函数是将回调函数变为 promise...
    99+
    2023-06-27
  • JavaScript中Promise怎么用
    这篇文章主要为大家展示了“JavaScript中Promise怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中Promise怎么用”这...
    99+
    2024-04-02
  • javascript中Promise.allSettled()怎么用
    这篇文章主要介绍了javascript中Promise.allSettled()怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Prom...
    99+
    2024-04-02
  • javascript中trim怎么用
    这篇文章主要介绍了javascript中trim怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 javas...
    99+
    2024-04-02
  • JavaScript中window.alert()怎么用
    这篇文章主要为大家展示了“JavaScript中window.alert()怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中windo...
    99+
    2024-04-02
  • javascript中Array.slice()怎么用
    小编给大家分享一下javascript中Array.slice()怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明通过Array.slice()方法,将指...
    99+
    2023-06-20
  • Javascript中constructor怎么用
    小编给大家分享一下Javascript中constructor怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!说明constructor 称为构造函数,因为它...
    99+
    2023-06-20
  • javascript中eval怎么用
    小编给大家分享一下javascript中eval怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • javascript中createjs怎么用
    这篇文章主要介绍了javascript中createjs怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。createjs简介官网:htt...
    99+
    2024-04-02
  • javascript中confirm怎么用
    这篇文章主要介绍javascript中confirm怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在JavaScript中,confirm()方法...
    99+
    2024-04-02
  • JavaScript中forEach()怎么用
    这篇文章主要为大家展示了“JavaScript中forEach()怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript中forEach()怎...
    99+
    2024-04-02
  • javascript中的style怎么用
    小编给大家分享一下javascript中的style怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! ...
    99+
    2024-04-02
  • JavaScript中的value怎么用
    这篇文章主要介绍“JavaScript中的value怎么用”,在日常操作中,相信很多人在JavaScript中的value怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作