我們平時使用的Array對象說它是數(shù)組,其實是一個從哈希表擴展的結(jié)構(gòu)體。因此它可以提供push、splice等一些列操作。這就意味著他們的效率是很低的。在JavaScript中也可以創(chuàng)建真正的數(shù)組,那就是強類型數(shù)組。這個概念在以前的JavaScript中是沒有的,由于現(xiàn)在JavaScript的發(fā)展,它變得可以調(diào)用一些系統(tǒng)底層的東西比如WebGL。這些底層的操作需要直接訪問內(nèi)存,而JavaScript本身的Array在內(nèi)存中是分散無法與底層操作對接,因此引入了這些強類型的數(shù)組。
強類型數(shù)組有三種基本類型:
Int 整數(shù)
Uint 無符號整數(shù)
Float IEEE754浮點數(shù)
根據(jù)這些基本類型可以引申出8種類數(shù)組:
Int8Array
Uint8Array
Int16Array
Uint16Array
Int32Array
Uint32Array
Float32Array
Float64Array
這些東西沒必要一個個去說明,他們的規(guī)律性很強。這些數(shù)組的命名都是:基本類型+位數(shù)+Array。我們都知道一個字節(jié)是8位的,所以8位的數(shù)組中每個元素就占一個字節(jié)。同理可知64位的數(shù)組每個元素占8個字節(jié)。就拿Int8Array來說,它是8位的整數(shù)。8位可以表示28=256個數(shù)字。而Int是有符號的,所以Int8Array的元素可以表示-128到127的整數(shù)。而Uint8Array的元素是無符號的,同理可知它可以表示0-255的整數(shù)。
由于這些數(shù)組是使用線性儲存,因此它們是定長的,無法給數(shù)組添加元素。超出索引的賦值不會報錯,也不會生效。下面是一個簡單的使用例子。
//創(chuàng)建一個具有3個元素的8為無符號整型數(shù)組
var a=new Uint8Array(3);
//把Array對象轉(zhuǎn)換成無符號數(shù)組
var b=new Uint8Array([1,2,3]);
//輸出到控制臺
console.log(a);
console.log(b);
這是最常用的兩種創(chuàng)建方式。第一中是傳入數(shù)組大小,這里我們傳入3,所以結(jié)果中輸出的數(shù)組有3個元素。而且這樣創(chuàng)建的數(shù)組把元素都初始化為0,不像C++中的new int不做初始化。第二種是傳入一個Array對象,轉(zhuǎn)換為Uint8Array。這樣得到的數(shù)組每一項的值就是原來Array對象中每一項的值。另外值得一提的是使用這個方法初始化時候,Array的元素是通過調(diào)用valueOf來轉(zhuǎn)換成數(shù)值的,無法轉(zhuǎn)換的數(shù)據(jù)則被置0。看下面這個例子
<script>
var o={
valueOf:function(){
return 123;
}
};
console.log(new Uint8Array([o,"123","xyz"]));
除了這兩種初始化方式外還有另一只不常用的方式。使用ArrayBuffer,也就是傳入一塊內(nèi)存指針來創(chuàng)建數(shù)組。ArrayBuffer的功能和C語言中的malloc相似,就是申請一塊連續(xù)的內(nèi)存,只不過它不需要手動釋放內(nèi)存而已。系統(tǒng)也不會直接返回個指針給JavaScript,ArrayBuffer的返回值是一個封裝成了對象的指針,我們就稱它為緩沖區(qū)吧。下面是使用這個玩意兒的例子。
var buf=new ArrayBuffer(4);
var a=new Uint16Array(buf);
console.log(a);
這個測試我就不截圖了,a這個數(shù)組只有兩個元素。因為Uint16Array是16位的,也就是每個元素占兩個字節(jié)。而之前申請的內(nèi)存控件是4個字節(jié),因此生成的數(shù)組只有兩個元素。也許你會好奇,如果申請的內(nèi)存空間的字節(jié)數(shù)為奇數(shù),再轉(zhuǎn)換成Uint16Array結(jié)果會如何呢?試試就知道
var buf=new ArrayBuffer(3);
var a=new Uint16Array(buf);
console.log(a);
這樣是會報錯的??桃馊ナ褂肁rrayBuffer的情況比較少,除非要讓兩個數(shù)組使用同一塊內(nèi)存空間。比如下面這個例子。
var buf=new ArrayBuffer(2);
var a=new Uint8Array(buf);
var b=new Int8Array(buf);
a[0]=100;
a[1]=200;
console.log(a);
console.log(b);
這個例子中兩個不同類型的數(shù)組使用了同一塊內(nèi)存空間。第一個元素是100,在Uint和Int中都可以顯示為100;而第二個元素是200,Int8Array的數(shù)據(jù)大值是127,因此溢出導(dǎo)致數(shù)組倒轉(zhuǎn)-128+200-128=-56。這就是不同類型的數(shù)組使用同一塊內(nèi)存空間。不僅是有無符號的區(qū)別,我們可以利用這個特性把32位的數(shù)組和8位的數(shù)組使用同一塊內(nèi)存控件來完成我們需要的操作,這里就不舉例了。
到這里“強類型數(shù)組”就基本介紹完了,如果有興趣深入研究可以去查看官方文檔。
本文來源于成都網(wǎng)站建設(shè)公司與成都網(wǎng)站設(shè)計制作公司-創(chuàng)新互聯(lián)成都公司!
當(dāng)前標(biāo)題:JavaScript的“強類型數(shù)組”簡介
文章分享:http://redsoil1982.com.cn/news41/326991.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司、、虛擬主機、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作、域名注冊
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源:
創(chuàng)新互聯(lián)