弄清楚 TypedArray & ArrayBuffer

一個(gè) TypedArray 對(duì)象描述了一個(gè)二進(jìn)制數(shù)組緩沖器(Buffer)的類(lèi)數(shù)組 (array-like) 視圖衍慎。TypeArray 是一個(gè)概念垦搬,既不存在于全局 (global) 對(duì)象中,也沒(méi)有自己的構(gòu)造函數(shù) (constructor)识樱,它是一系列擁有特定類(lèi)型 (specific element types) 的數(shù)組的集合體嗤无,這類(lèi)型的數(shù)組我們稱(chēng)為 Typed Array (有類(lèi)型的數(shù)組)。

我們知道 JS 的數(shù)組里面可以放各種類(lèi)型的數(shù)據(jù)牺荠,在 Typed Array 的數(shù)組中翁巍,我們要求數(shù)組中的數(shù)據(jù)都是其指定的類(lèi)型。

TypedArray 擁有11種類(lèi)型休雌,依次是:

  • Int8Array
  • Uint8Array
  • Uint8ClampedArray
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • Float32Array
  • Float64Array
  • BigInt64Array
  • BigUint64Array

上面這些類(lèi)型擁有相同的構(gòu)造方法(把下面的 TypedArray 替換成對(duì)應(yīng)的類(lèi)型)

// 多種構(gòu)造方式
new TypedArray();
new TypedArray(length);
new TypedArray(typedArray);
new TypedArray(object);
new TypedArray(buffer [, byteOffset [, length]]);

每個(gè)類(lèi)型的常用方法基本等同于傳統(tǒng)的 Array灶壶,這里就不贅述了。

說(shuō)了相同點(diǎn)杈曲,下面來(lái)看看不同點(diǎn)驰凛。每個(gè)類(lèi)型區(qū)別在于數(shù)組中元素的取值范圍 (Value Range) 的不同,例如 Uint8Array 里面元素的類(lèi)型是無(wú)符號(hào)8字節(jié)担扑,范圍就是 0 ~ 255(= 2? - 1) 恰响。

下面我們用一段代碼來(lái)對(duì)取值范圍做進(jìn)一步研究

var uint8 = new Uint8Array(10)
var a = uint8[0] = 255
var b = uint8[1] = 256
var c = uint8[2] = 257

上面 a b c unit8[0] unit8[1] unit8[2] 的值分別是多少?大家先自己想想涌献。

公布答案:255胚宦、256、257燕垃、255枢劝、0、1

Unit8Array 會(huì)對(duì)每個(gè)元素進(jìn)行取模 (%) 運(yùn)算:255 % 256 = 255卜壕、256 % 256 = 0 ...
至于像 Int8Array (取值范圍 -127 ~ 128) 這種帶符號(hào)的您旁,會(huì)涉及到補(bǔ)位的概念,稍微有點(diǎn)復(fù)雜轴捎,這里不做進(jìn)一步深入鹤盒,大家不了解的可以去查一些數(shù)據(jù)基礎(chǔ)方面的資料。

那么當(dāng)我們對(duì)元素賦非數(shù)字的值的時(shí)候侦副,會(huì)發(fā)生什么呢侦锯?

var uint8 = new Uint8Array(10)
uint8[0] = 'abc'
uint8[1] = '123hello'
uint8[2] = '444'
uint8[3] = true
uint8[4] = false

結(jié)果分別是:0、0秦驯、258率触、1、0。你答對(duì)了嗎葱蝗?
背后的邏輯就是 TypedArray 會(huì)對(duì)賦的值進(jìn)行 Number(value) 操作穴张。

還有要注意的是,TypedArray 的長(zhǎng)度是在初始化 (new) 的時(shí)候就固定 (fixed-length) 的两曼,并不能像普通 Array 那樣動(dòng)態(tài)改變數(shù)組長(zhǎng)度皂甘。例如:

var uint8 = new Uint8Array(10)
uint8[11] = 100
console.log(uint8[11])

控制臺(tái)打出的結(jié)果是 undefined

總的來(lái)說(shuō),TypedArray 數(shù)組的作用悼凑,是確保每個(gè)元素都是在一定的范圍內(nèi)的整數(shù)或浮點(diǎn)數(shù)偿枕,為一些特定業(yè)務(wù)的處理提供了便捷。

說(shuō)完 TypedArray户辫,我們來(lái)說(shuō)說(shuō) ArrayBuffer渐夸。ArrayBuffer 在其他開(kāi)發(fā)語(yǔ)言中常被成為 Byte Array,它也是個(gè)定長(zhǎng) (fixed-length) 的數(shù)組渔欢。由于 ArrayBuffer 不能直接進(jìn)行操作墓塌,所以通常用 TypeArrayDataView 對(duì)其進(jìn)行封裝后再進(jìn)行操作。下圖展示了 ArrayBuffer 的結(jié)構(gòu)并對(duì)其直接操作:

ArrayBuffer.png

我們看到對(duì) ArrayBuffer 用數(shù)組的方式賦值奥额,其實(shí)就是創(chuàng)建了新的屬性苫幢。那么按照上面說(shuō)的,要操作 ArrayBuffer垫挨,我們需要先對(duì)齊進(jìn)行封裝

var uint8 = new Uint8Array(arrayBuffer)
uint8[3] = 17

這時(shí)候我們?cè)賮?lái)看下結(jié)果韩肝,見(jiàn)下圖

對(duì)ArrayBuffer操作.png

ArrayBuffer 的實(shí)例除了通過(guò) new 函數(shù)獲得,文件的讀寫(xiě)操作喝 Base64 的轉(zhuǎn)換也能從中獲得 ArrayBuffer九榔。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哀峻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子哲泊,更是在濱河造成了極大的恐慌剩蟀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攻旦,死亡現(xiàn)場(chǎng)離奇詭異喻旷,居然都是意外死亡生逸,警方通過(guò)查閱死者的電腦和手機(jī)牢屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)槽袄,“玉大人烙无,你說(shuō)我怎么就攤上這事”槌撸” “怎么了截酷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)乾戏。 經(jīng)常有香客問(wèn)我迂苛,道長(zhǎng)三热,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任三幻,我火速辦了婚禮就漾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘念搬。我一直安慰自己抑堡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布朗徊。 她就那樣靜靜地躺著首妖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爷恳。 梳的紋絲不亂的頭發(fā)上有缆,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音舌仍,去河邊找鬼妒貌。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铸豁,可吹牛的內(nèi)容都是我干的灌曙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼节芥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼在刺!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起头镊,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚣驼,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后相艇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颖杏,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年坛芽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了留储。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咙轩,死狀恐怖获讳,靈堂內(nèi)的尸體忽然破棺而出映挂,到底是詐尸還是另有隱情朝扼,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布淫半,位于F島的核電站,受9級(jí)特大地震影響帅矗,放射性物質(zhì)發(fā)生泄漏偎肃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一浑此、第九天 我趴在偏房一處隱蔽的房頂上張望软棺。 院中可真熱鬧,春花似錦尤勋、人聲如沸喘落。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瘦棋。三九已至,卻和暖如春暖哨,著一層夾襖步出監(jiān)牢的瞬間赌朋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工篇裁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沛慢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓达布,卻偏偏與公主長(zhǎng)得像团甲,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子黍聂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容