亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

HTML5引入的新數組TypedArray介紹

2024-04-27 15:05:47
字體:
來源:轉載
供稿:網友
avascript中的數組是個強大的家伙:你可以創建的時候不規定長度,而是動態的去改變長度。你可以把他當成普通的數組去讀取,也可以當他是堆棧來使用。你可以改變數組中每個元素的值甚至是類型javascript中的數組是個強大的家伙:你可以創建的時候不規定長度,而是動態的去改變長度。你可以把他當成普通的數組去讀取,也可以當他是堆棧來使用。你可以改變數組中每個元素的值甚至是類型。

好吧,其實他是一個對象,比如我們可以這樣去創建數組:

復制代碼代碼如下:var array = new Array(10);Javascript的數組的強大以及全能,給我們帶來了便捷性。但一般而言:

全能的東西能在各種環境下使用,但卻不一定適用于各種環境。

而TypedArray正是為了解決Javascript中數組“干太多事”而出現的。

起源

TypedArray是一種通用的固定長度緩沖區類型,允許讀取緩沖區中的二進制數據。

其在WEBGL規范中被引入用于解決Javascript處理二進制數據的問題。

TypedArray已經被大部分現代瀏覽器支持,例如可以用下面方法創建TypedArray:

復制代碼代碼如下:// 創建一個8-byte的ArrayBuffervar b = new ArrayBuffer(8);// 創建一個b的引用,類型是Int32,起始位置在0,結束位置為緩沖區尾部var v1 = new Int32Array(b);// 創建一個b的引用,類型是Uint8,起始位置在2,結束位置為緩沖區尾部var v2 = new Uint8Array(b, 2);// 創建一個b的引用,類型是Int16,起始位置在2,總長度為2var v3 = new Int16Array(b, 2, 2);則緩沖和創建的引用布局為:
變量索引
 字節數
b =01234567
 索引數
v1 =01
v2 = 012345
v3 = 01 
這表示Int32類型的v1數組的第0個元素是ArrayBuffer類型的b的第0-3個字節,如此等等。構造函數

上面我們通過ArrayBuffer來創建TypedArray,而實際上,TypedArray提供了3個構造函數來創建他的實例。

構造函數復制代碼代碼如下:TypedArray(unsigned long length)創建一個新的TypedArray,length是其固定長度。復制代碼代碼如下:TypedArray(TypedArray array)TypedArray(type[] array)創建一個新的TypedArray,其每個元素根據array進行初始化,元素進行了相應的類型轉換。復制代碼代碼如下:TypedArray(ArrayBuffer buffer, optional unsigned long byteOffset, optional unsigned long length)創建一個新的TypedArray,使其作為buffer的一個引用,byteOffset為其起始的偏移量,length為其長度。所以通常我們用下面的方式創建TypedArray:復制代碼代碼如下:var array = new Uint8Array(10);或者:復制代碼代碼如下:var array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); 數據操作

TypedArray提供了setter、getter、set和subarray四個方法進行數據操作。

方法getter type get(unsigned long index)

返回指定索引的元素。

setter void set(unsigned long index, type value)

設置指定索引的元素為指定值。

void set(TypedArray array, optional unsigned long offset)void set(type[] array, optional unsigned long offset)

根據array設置值,offset為偏移位置。

TypedArray subarray(long begin, optional long end)

返回一個新的TypedArray,起始位為begin,結束位為end。

例如讀取元素可以用

var array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);alert(array[4]); //5

設置元素可以用

var array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);alert(array[4]); //5array[4] = 12;alert(array[4]); //12

獲取一個副本可以用

var array = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);var array2 = array.subarray(0);數組類型

類型大小描述Web IDL類型C 類型
Int8Array18位有符號整數bytesigned char
Uint8Array18位無符號整數octetunsigned char
Uint8ClampedArray18位無符號整數 (clamped)octetunsigned char
Int16Array216位有符號整數shortshort
Uint16Array216位無符號整數unsigned shortunsigned short
Int32Array432位有符號整數longint
Uint32Array432位無符號整數unsigned longunsigned int
Float32Array432位IEEE浮點數unrestricted floatfloat
Float64Array864位IEEE浮點數unrestricted doubledouble
玩過canvas的可能會覺得很眼熟。

因為ImageData中用于存儲圖像數據的數組便是Uint8ClampedArray類型的。

例如:

var context = document.createElement("canvas").getContext("2d");var imageData = context.createImageData(100, 100);console.log(imageData.data);

其在FireBug中顯示為

Uint8ClampedArray { 0=0, 1=0, 2=0, 更多...}

為什么要用TypedArray

我們知道Javascript中數字是64位浮點數。則對于一個二進制圖片(圖片每個像素點是以8位無符號整數存儲的),如果要將其數據在Javascript數組中使用,相當于使用了圖片8倍的內存來存儲一個圖片的數據,這顯然是不科學的。而TypedArray能幫助我們只使用原來1/8的內存來存儲圖片數據。

或者對于WebSocket,如果用base64進行傳輸也是一個花費較高的方式,轉而使用二進制傳送可能是更好的方式。

當然,TypedArray還有更多好處,比如具有更好的性能,下面我們進行一些小測試來驗證這一點。

參與測試的瀏覽器為

Firefox 17.0.1 和 Chrome 23.0.1271.97m

Test1:順序讀取速讀復制代碼代碼如下:var timeArray1 = [];var timeArray2 = [];function check1(){var array = new Uint8ClampedArray(5000000);for(var i = array.length; i--;){array[i] = Math.floor(Math.random() * 100);}var temp;var time1 = (new Date()).getTime();for(var i = array.length; i--;){temp = array[i];}var time2 = (new Date()).getTime();console.log(time2 - time1);timeArray1.push(time2 - time1);}function check2(){var array2 = new Array(5000000);for(var i = array2.length; i--;){array2[i] = Math.floor(Math.random() * 100);}var temp;var time3 = (new Date()).getTime();for(var i = array2.length; i--;){temp = array2[i];}var time4 = (new Date()).getTime();console.log(time4 - time3);timeArray2.push(time4 - time3);}function timer(__fun, __time, __callback){var now = 0;function begin(){var timeout = setTimeout(function(){if(now !== __time){now++;__fun();begin();}else{if(timeArray1.length && timeArray2.length){console.log("timeArray1 == " + timeArray1 + ", average == " + average(timeArray1));console.log("timeArray2 == " + timeArray2 + ", average == " + average(timeArray2));}__callback && __callback();}}, 100);}begin();}function average(__array){var total = 0;for(var i = __array.length; i--;){total += __array[i];}return (total / __array.length);}timer(check1, 10, function(){timer(check2, 10);});

可見Uint8ClampedArray的讀取速度明顯比Array要快(條狀柱越長,代表花費時間越多)。

Test2:隨機讀取復制代碼代碼如下://……function check1(){var array = new Uint8ClampedArray(5000000);for(var i = array.length; i--;){array[i] = Math.floor(Math.random() * 100);}var temp;var time1 = (new Date()).getTime();for(var i = array.length; i--;){temp = array[Math.floor(Math.random() * 5000000)];}var time2 = (new Date()).getTime();console.log(time2 - time1);timeArray1.push(time2 - time1);}function check2(){var array2 = new Array(5000000);for(var i = array2.length; i--;){array2[i] = Math.floor(Math.random() * 100);}var temp;var time3 = (new Date()).getTime();for(var i = array2.length; i--;){temp = array2[Math.floor(Math.random() * 5000000)];}var time4 = (new Date()).getTime();console.log(time4 - time3);timeArray2.push(time4 - time3);}//……

隨即讀取中Uint8ClampedArray的讀取速度也是比Array要快的。

Test3:順序寫入復制代碼代碼如下://……function check1(){var array = new Uint8ClampedArray(5000000);var time1 = (new Date()).getTime();for(var i = array.length; i--;){array[i] = Math.floor(Math.random() * 100);}var time2 = (new Date()).getTime();console.log(time2 - time1);timeArray1.push(time2 - time1);}function check2(){var array2 = new Array(5000000);var time3 = (new Date()).getTime();for(var i = array2.length; i--;){array2[i] = Math.floor(Math.random() * 100);}var time4 = (new Date()).getTime();console.log(time4 - time3);timeArray2.push(time4 - time3);}//……

Test4:復制操作(U8C to U8C 和 Array to U8C)

復制代碼代碼如下://……function check1(){var array = new Uint8ClampedArray(5000000);for(var i = array.length; i--;){array[i] = Math.floor(Math.random() * 100);}var temp;var array2 = new Uint8ClampedArray(5000000);var time1 = (new Date()).getTime();array2.set(array);var time2 = (new Date()).getTime();console.log(time2 - time1);timeArray2.push(time2 - time1);}function check2(){var array = new Array(5000000);for(var i = array.length; i--;){array[i] = Math.floor(Math.random() * 100);}var temp;var array2 = new Uint8ClampedArray(5000000);var time1 = (new Date()).getTime();array2.set(array);var time2 = (new Date()).getTime();console.log(time2 - time1);timeArray2.push(time2 - time1);}//……

可見U8C復制到U8C,比Array復制到U8C快得多。

------------------------------------------------------------------------------------------

msdn上uint8Array介紹

Uint8Array 對象

 

8 位無符號整數值的類型化數組。內容將初始化為 0。如果無法分配請求數目的字節,則將引發異常。

語法

      uint8Array = new Uint8Array( length );uint8Array = new Uint8Array( array );uint8Array = new Uint8Array( buffer, byteOffset, length);

參數

uint8Array

必選。 Uint8Array 對象分配到的變量名稱。

length

指定數組中元素的數目。

array

該數組中包含的數組(或類型化數組)。內容將初始化為給定數組或類型化數組的內容,且每個元素均轉換為 Uint8 類型。

buffer

Uint8Array 表示的 ArrayBuffer。

byteOffset

可選。指定與 Uint8Array 將開始的緩沖區開始處的偏移量(以字節為單位)。

length

數組中的元素數。

常量

下表列出了 Uint8Array 對象的常量。

常量

說明

BYTES_PER_ELEMENT 常量

數組中每個元素的大?。ㄒ宰止潪閱挝唬?。

屬性

下表列出了 Uint8Array 對象的常量。

屬性

說明

buffer 屬性

只讀。獲取此數組引用的 ArrayBuffer。

byteLength 屬性

只讀。此數組距離其 ArrayBuffer 開始處的長度(以字節為單位),在構造時已固定。

byteOffset 屬性

只讀。此數組與其 ArrayBuffer 開始處的偏移量(以字節為單位),在構造時已固定。

length 屬性

數組的長度。

  

方法

下表列出了 Uint8Array 對象的方法。

方法

說明

set 方法 (Uint8Array)

設置值或值數組。

subarray 方法 (Uint8Array)

為此數組獲取 ArrayBuffer 存儲的新 Uint8Array 視圖。

以下示例演示如何使用 Uint8Array 對象處理從 xmlHttPRequest 獲取的二進制數據:

JavaScript
var req = new xmlhttpRequest();    req.open('GET', "http://www.example.com");    req.responseType = "arraybuffer";    req.send();    req.onreadystatechange = function () {        if (req.readyState === 4) {            var buffer = req.response;            var dataview = new DataView(buffer);            var ints = new Uint8Array(buffer.byteLength);            for (var i = 0; i < ints.length; i++) {                ints[i] = dataview.getUint8(i);            }        alert(ints[10]);        }    }

要求

在以下文檔模式中受支持:Internet Explorer 10 標準模式和 Internet Explorer 11 標準模式。此外,也在應用商店應用(Windows 8 和 Windows Phone 8.1)中受支持。請參閱版本信息。

在以下文檔模式中不受支持:Quirks、Internet Explorer 6 標準模式、Internet Explorer 7 標準模式、Internet Explorer 8 標準模式、Internet Explorer 9 標準模式。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久国产视频网站| 欧美电影《睫毛膏》| 91欧美精品午夜性色福利在线| 亚洲男人天堂手机在线| 亚洲国产欧美一区| 国产一区二区三区丝袜| 成人免费看吃奶视频网站| 视频在线观看一区二区| 亚洲无av在线中文字幕| 亚洲性线免费观看视频成熟| 91地址最新发布| 亚洲一区999| 久久精品国产久精国产思思| 日韩欧美主播在线| 国产精品盗摄久久久| 亚洲欧洲国产一区| 中文一区二区视频| 欧美专区在线播放| 色小说视频一区| 亚洲图片在线综合| 欧美成人三级视频网站| 国产精品久久久久一区二区| 国产精品国产三级国产aⅴ9色| 欧美性极品xxxx娇小| 亚洲精品99999| 亚洲综合中文字幕在线| 国产a∨精品一区二区三区不卡| 久久国产精品亚洲| 久久99热这里只有精品国产| 国内偷自视频区视频综合| 97福利一区二区| 在线成人激情黄色| 国产精品久久久久久久久久久久| 久久久精品在线观看| 亚洲人成网7777777国产| 成人性教育视频在线观看| 国产第一区电影| 91亚洲精品久久久久久久久久久久| 羞羞色国产精品| 欧美高清第一页| 精品亚洲夜色av98在线观看| 91国产精品电影| 亚洲精品一区二区三区婷婷月| 欧美国产日韩一区二区| 欧美高清电影在线看| 91精品国产成人| 亚洲欧美另类国产| 亚洲成人黄色网| 成人中文字幕+乱码+中文字幕| 深夜福利一区二区| 2018中文字幕一区二区三区| 欧美成人激情视频| 色综合久久88| 久久久久国色av免费观看性色| 国产精品久久综合av爱欲tv| 岛国av午夜精品| 日韩视频在线免费| 亚洲国产精品视频在线观看| 韩剧1988在线观看免费完整版| 日本精品久久久久久久| 亚洲激情国产精品| 久久久久久一区二区三区| 国产成人久久久精品一区| 亚洲精品成人久久久| 日韩中文字幕av| 日韩欧美国产一区二区| 国产色综合天天综合网| 久热99视频在线观看| 国产精品久久久久国产a级| 欧美电影在线观看| 一二美女精品欧洲| 久久精品99国产精品酒店日本| 日韩视频在线免费| 国产精品xxxxx| 久久久久中文字幕2018| 蜜臀久久99精品久久久久久宅男| 国产97在线|日韩| 亚洲成人教育av| 欧美大秀在线观看| 91亚洲国产精品| 中文字幕亚洲自拍| 日韩在线中文字| 欧美另类xxx| 日韩高清电影免费观看完整| 国产最新精品视频| 91久久精品一区| 最好看的2019的中文字幕视频| 国产成人精品国内自产拍免费看| 色偷偷9999www| 欧美老女人在线视频| 国产精品劲爆视频| 欧美激情在线播放| 亚洲欧洲成视频免费观看| 亚洲精品国产精品自产a区红杏吧| 亚洲国产精品一区二区久| 九九热这里只有精品免费看| 亚洲精品久久久久久久久久久久久| 欧美黑人狂野猛交老妇| 亚洲成人激情图| 中文字幕久热精品在线视频| 国产成人jvid在线播放| 精品亚洲永久免费精品| 97在线看免费观看视频在线观看| 另类色图亚洲色图| 国产亚洲精品成人av久久ww| 国产欧美一区二区三区久久人妖| 亚洲国产精品久久久久| 国产一区二区三区在线观看网站| 日韩最新免费不卡| 欧美精品免费在线观看| 国产精品久久久久久超碰| 国产在线观看91精品一区| 欧美xxxx综合视频| 久久精品2019中文字幕| 亚洲女同精品视频| 国产色婷婷国产综合在线理论片a| 色综合伊人色综合网站| 欧美成人h版在线观看| 色狠狠av一区二区三区香蕉蜜桃| 日韩免费不卡av| 精品成人久久av| 国产精品va在线播放| 亚洲第一色中文字幕| 亚洲精品免费一区二区三区| 欧美成人精品h版在线观看| 国产精品久久久久久久久久三级| 亚洲第一区第一页| 亚洲精品免费一区二区三区| 成人a在线视频| 8090成年在线看片午夜| 亚洲成色999久久网站| 亚州欧美日韩中文视频| 亚洲伦理中文字幕| 亚洲国产精品资源| 久久999免费视频| 伦伦影院午夜日韩欧美限制| 日韩成人性视频| 亚洲老板91色精品久久| 中文字幕久久亚洲| 国产日韩欧美在线播放| 91系列在线观看| 久久躁日日躁aaaaxxxx| 懂色av中文一区二区三区天美| 亚洲国产欧美精品| 亚洲精品国精品久久99热| 在线日韩日本国产亚洲| 91视频免费在线| 国产精品一久久香蕉国产线看观看| 清纯唯美日韩制服另类| 亚洲最大中文字幕| 久久久久久久久国产精品| 国产成人精品久久亚洲高清不卡| 亚洲少妇激情视频| 成人福利网站在线观看| 精品久久久国产| 欧美老妇交乱视频| 欧美精品久久久久久久| 亚洲国产精品国自产拍av秋霞| 久久久久久综合网天天| 欧美精品日韩www.p站| 欧美激情视频播放| 久久久久日韩精品久久久男男| 欧美成人午夜剧场免费观看| 亚洲成人网久久久|