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