中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

JavaScript的“強(qiáng)類(lèi)型數(shù)組”簡(jiǎn)介

2024-04-30    分類(lèi): 網(wǎng)站建設(shè)

我們平時(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)

網(wǎng)站優(yōu)化排名
平遥县| 都江堰市| 曲麻莱县| 札达县| 公安县| 海兴县| 晋城| 新竹市| 大港区| 盘锦市| 高青县| 广水市| 达尔| 雷波县| 石屏县| 南华县| 九寨沟县| 宁陵县| 陇川县| 黎川县| 神木县| 桐梓县| 浦东新区| 澄江县| 涡阳县| 河东区| 社会| 乐业县| 阿拉善左旗| 鲜城| 民勤县| 黑龙江省| 囊谦县| 谢通门县| 通城县| 婺源县| 淮滨县| 饶阳县| 兴业县| 永平县| 昭苏县|