最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript中的ArrayBuffer詳細介紹

 更新時間:2014年12月08日 10:11:36   投稿:junjie  
這篇文章主要介紹了JavaScript中的ArrayBuffer詳細介紹,本文講解了Array 在內(nèi)存中的堆棧模型、原始緩沖區(qū)的創(chuàng)建、數(shù)據(jù)化數(shù)組、DataView對象、XHR2 中的 ArrayBuffer等內(nèi)容,需要的朋友可以參考下

相信每一個 javascript 學習者,都會去了解 JS 的各種基本數(shù)據(jù)類型,數(shù)組就是數(shù)據(jù)的組合,這是一個很基本也十分簡單的概念,他的內(nèi)容沒多少,學好它也不是件難事情。但是本文著重要介紹的并不是我們往??吹降?Array,而是 ArrayBuffer。

我寫的很多東西都是因為要完成某些特定的功能而刻意總結(jié)的,可以算是備忘,本文也是如此!前段時間一直在研究 Web Audio API 以及語音通信相關的知識,內(nèi)容側(cè)重于音頻流在 AudioContext 各個節(jié)點之間的流動情況,而現(xiàn)在要摸清楚音頻到流底是個什么樣的數(shù)據(jù)格式,所以對 ArrayBuffer 的研究就顯得格外重要了。

Array 在內(nèi)存中的堆棧模型

Array 的獲取

Javascript 中如何產(chǎn)生 Array:

復制代碼 代碼如下:

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

直接定義,或者通過構(gòu)造函數(shù)創(chuàng)建一個 Array,當然也可以使用其他的手段:

復制代碼 代碼如下:

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

等等,方式有很多。但是 Array 內(nèi)部是個什么樣的結(jié)構(gòu),恐怕很多人還不是很清楚。

堆棧模型

在數(shù)組中我們可以放很多不同數(shù)據(jù)類型的數(shù)據(jù),如:

復制代碼 代碼如下:

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

上面這個數(shù)組中一次放入了 數(shù)字、字符串、對象、函數(shù)、undefined 和 null,對于上面的數(shù)據(jù)接口我們可以具象的描述下:

復制代碼 代碼如下:

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

JavaScript 的數(shù)據(jù)類型分為兩種,一種是值類型,一種是引用類型,常見的引用類型有 Object 和 Array,數(shù)組的儲存模型中,如果是諸如 Number、String 之類的值類型數(shù)據(jù)會被直接壓入棧中,而引用類型只會壓入對該值的一個索引,用 C 語言的概念來解釋就是只保存了數(shù)據(jù)的指針,這些數(shù)據(jù)是儲存在堆中的某塊區(qū)間中。棧堆并不是獨立的,棧也可以在堆中存放。

好了,對 Array 的說明就到這里,下面具體說說 ArrayBuffer 的相關知識。

ArrayBuffer

web 是個啥玩意兒,web 要討論的最基本問題是什么?我覺得有兩點,一個是數(shù)據(jù),一個是數(shù)據(jù)傳輸,至于數(shù)據(jù)的展示,紛繁復雜,這個應該是 web 上層的東西。而本文要討論的 ArrayBuffer 就是最基礎的數(shù)據(jù)類型,甚至不能稱之為數(shù)據(jù)類型,它是一個數(shù)據(jù)容易,需要通過其他方式來讀寫。

官方點的定義:

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.
表示二進制數(shù)據(jù)的原始緩沖區(qū),該緩沖區(qū)用于存儲各種類型化數(shù)組的數(shù)據(jù)。 無法直接讀取或?qū)懭?ArrayBuffer,但可根據(jù)需要將其傳遞到類型化數(shù)組或 DataView 對象 來解釋原始緩沖區(qū)。

他是一個二進制數(shù)據(jù)的原始緩沖區(qū),雖然 JavaScript 是弱類型語言,但是他本身是對數(shù)據(jù)的類型和大小都有限制的,我們需要通過某種數(shù)據(jù)結(jié)構(gòu)將緩沖區(qū)的內(nèi)容有序的讀取出來(寫進去)。

原始緩沖區(qū)的創(chuàng)建

通過 ArrayBuffer 這個構(gòu)造函數(shù)可以創(chuàng)建一個原始緩沖區(qū):

復制代碼 代碼如下:

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

數(shù)據(jù)化數(shù)組

類型化數(shù)組類型表示可編制索引和操縱的 ArrayBuffer 對象 的各種視圖。 所有數(shù)組類型的長度均固定。

復制代碼 代碼如下:

名稱  大?。ㄒ宰止?jié)為單位)  描述
Int8Array  1  8 位二補碼有符號整數(shù)
Uint8Array  1  8 位無符號整數(shù)
Int16Array  2  16 位二補碼有符號整數(shù)
Uint16Array  2  16 位無符號整數(shù)
Int32Array  4  32 位二補碼有符號整數(shù)
Uint32Array  4  32 位無符號整數(shù)
Float32Array  4  32 位 IEEE 浮點數(shù)
Float64Array  8  64 位 IEEE 浮點數(shù)

Int 就是整型,Uint 為無符號整形,F(xiàn)loat 為浮點型,這些是 C 語言中的基本概念,我就不具體解釋了。由于這些視圖化結(jié)構(gòu)都是大同小異,本文只對 Float32Array 類型作說明,讀者可以舉一反三。

Float32Array 跟 Array 是十分類似的,只不過他每一個元素都是都是一個 32位(4字節(jié)) 的浮點型數(shù)據(jù)。Float32Array 一旦創(chuàng)建其大小不能再修改。

我們可以直接創(chuàng)建一個 Float32Array:

復制代碼 代碼如下:

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

需要有這么一個概念,他依然是一個數(shù)組,只不過該數(shù)組中的每個元素都是 Float 32 位的數(shù)據(jù)類型,再如:

復制代碼 代碼如下:

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

我們把一個數(shù)組的值直接賦給了 x 這個 Float32Array 對象,那么在儲存之前會將它轉(zhuǎn)換成一個 32位浮點數(shù)。

由于該類數(shù)組的每個元素都是同一類型,所以在堆棧模型中,他們?nèi)繒粔喝氲綏V校虼藬?shù)據(jù)化數(shù)組都是值類型,他并不是引用類型!這個要引起注意,從下面的例子中也可以反映出來:

復制代碼 代碼如下:

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

將 x 的值復制給 y,修改 x[0], y[0] 并沒有變化。

除了上面的方式,我們還可以通過其他方式來創(chuàng)建一個數(shù)據(jù)化數(shù)組:

復制代碼 代碼如下:

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

      Created By Barret Lee

看了上面的圖解還有疑問么?我覺得我不用繼續(xù)解釋了??梢园?ArrayBuffer 的單位看成 1,而 Float32Array 的單位是 4.

DataView對象

DataView 對象對數(shù)據(jù)的操作更加細致,不過我覺得沒啥意思,上面提到的各種數(shù)據(jù)化數(shù)組已經(jīng)可以基本滿足應用了,所以這里就一筆帶過,一個簡單的示例:

復制代碼 代碼如下:

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)); // 22
console.log(x.getFloat32(1)); // 3.1415927410125732

如果感興趣,可以移步http://www.javascripture.com/DataView,作詳細了解。

XHR2 中的 ArrayBuffer

ArrayBuffer 的應用特別廣泛,無論是 WebSocket、WebAudio 還是 Ajax等等,前端方面只要是處理大數(shù)據(jù)或者想提高數(shù)據(jù)處理性能,那一定是少不了 ArrayBuffer 。

XHR2 并不是什么新東西,可能你用到了相關的特性,卻不知這就是 XHR2 的內(nèi)容。最主要的一個東西就是 xhr.responseType,他的作用是設置響應的數(shù)據(jù)格式,可選參數(shù)有:"text"、"arraybuffer"、"blob"或"document"。請注意,設置(或忽略)xhr.responseType = '' 會默認將響應設為"text"。這里存在一個這樣的對應關系:

復制代碼 代碼如下:

請求            響應
text            DOMString
arraybuffer     ArrayBuffer
blob            Blob
document        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,那么在拿到的數(shù)據(jù)中就可以用數(shù)據(jù)化數(shù)組來接受啦!

小結(jié)

本文主要介紹了 Array 在堆棧模型中的存放方式,也詳細描述了 ArrayBuffer 這個原始緩沖區(qū)的二進制數(shù)據(jù)類型,在 web 開發(fā)中,數(shù)據(jù)以及數(shù)據(jù)的儲存是一個重要的部分,希望引起注意!

本文敘述上可能存在錯誤,請多多斧正!

相關文章

  • 在Koa.js中實現(xiàn)文件上傳的接口功能

    在Koa.js中實現(xiàn)文件上傳的接口功能

    這篇文章主要介紹了在Koa.js中實現(xiàn)文件上傳的接口功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • javascript的理解及經(jīng)典案例分析

    javascript的理解及經(jīng)典案例分析

    下面小編就為大家?guī)硪黄猨avascript的理解及經(jīng)典案例分析。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • JavaScript判斷是否為數(shù)組的3種方法及效率比較

    JavaScript判斷是否為數(shù)組的3種方法及效率比較

    這篇文章主要介紹了JavaScript判斷是否為數(shù)組的3種方法及效率比較,本文直接給出運行效果和實現(xiàn)代碼,需要的朋友可以參考下
    2015-04-04
  • js獲取ip和地區(qū)

    js獲取ip和地區(qū)

    本文主要介紹了js獲取ip和地區(qū)的方法,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • JS數(shù)組中對象去重操作示例

    JS數(shù)組中對象去重操作示例

    這篇文章主要介紹了JS數(shù)組中對象去重操作,涉及javascript數(shù)組對象遍歷、比較、運算等相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • 針對JavaScript中this指向的簡單理解

    針對JavaScript中this指向的簡單理解

    這篇文章主要為大家詳細JavaScript中this指向的簡單理解,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 一文帶你深入理解JavaScript模板引擎

    一文帶你深入理解JavaScript模板引擎

    在Web前端開發(fā)中,需要將數(shù)據(jù)動態(tài)渲染到頁面上,隨著應用程序的復雜度增加,數(shù)據(jù)渲染的邏輯也變得越來越復雜,這時候就需要使用模板引擎來幫助我們動態(tài)生成HTML標記,本文將深入介紹 JavaScript 模板引擎,幫助讀者更好地理解和應用模板引擎
    2023-06-06
  • javascript 兼容鼠標滾輪事件

    javascript 兼容鼠標滾輪事件

    瀏覽地圖時,使用鼠標滾輪來放大和縮小。即用到了滾輪事件。
    2009-04-04
  • JS隨即打亂數(shù)組實現(xiàn)代碼

    JS隨即打亂數(shù)組實現(xiàn)代碼

    使用javascript過程中,偶爾會用到數(shù)值,而且是打亂后的數(shù)值,本文將介紹一種高效打亂數(shù)組的方法,需要的朋友可以參考下
    2012-12-12
  • 微信小程序基礎教程之echart的使用

    微信小程序基礎教程之echart的使用

    簡單的使用echarts不難,但是在小程序里用echarts可能有些理不清。所以這篇文章主要給大家介紹了關于微信小程序基礎教程之echart使用的相關資料,需要的朋友可以參考下
    2021-06-06

最新評論

高密市| 六盘水市| 康乐县| 马龙县| 德惠市| 佛教| 宁城县| 桦甸市| 如皋市| 弥勒县| 阳原县| 青岛市| 杨浦区| 瓮安县| 宁陕县| 大连市| 衡阳市| 泾川县| 阿拉善右旗| 来安县| 威海市| 南陵县| 宝鸡市| 大方县| 伊金霍洛旗| 昌江| 长治县| 阳朔县| 临清市| 景宁| 曲水县| 莎车县| 郧西县| 岳普湖县| 偃师市| 楚雄市| 晋宁县| 焦作市| 敦化市| 保德县| 城口县|