html中显示变量的数组,HTML5引入的新数组TypedArray介绍

news/2024/7/5 1:57:56

Javascript中的数组是个强大的家伙:

你可以创建的时候不规定长度,而是动态的去改变长度。你可以把他当成普通的数组去读取,也可以当他是堆栈来使用。你可以改变数组中每个元素的值甚至是类型。

好吧,其实他是一个对象,比如我们可以这样去创建数组:

复制代码代码如下:

var array = new Array(10);

Javascript的数组的强大以及全能,给我们带来了便捷性。但一般而言:

全能的东西能在各种环境下使用,但却不一定适用于各种环境。

而TypedArray正是为了解决Javascript中数组“干太多事”而出现的。

e20b7bc59315b99cc42cbb2e50239649.png

起源

TypedArray是一种通用的固定长度缓冲区类型,允许读取缓冲区中的二进制数据。

其在WEBGL规范中被引入用于解决Javascript处理二进制数据的问题。

TypedArray已经被大部分现代浏览器支持,例如可以用下面方法创建TypedArray:

复制代码代码如下:

// 创建一个8-byte的ArrayBuffer

var b = new ArrayBuffer(8);

// 创建一个b的引用,类型是Int32,起始位置在0,结束位置为缓冲区尾部

var v1 = new Int32Array(b);

// 创建一个b的引用,类型是Uint8,起始位置在2,结束位置为缓冲区尾部

var v2 = new Uint8Array(b, 2);

// 创建一个b的引用,类型是Int16,起始位置在2,总长度为2

var v3 = new Int16Array(b, 2, 2);

则缓冲和创建的引用布局为:

变量

索引

字节数

b =

0

1

2

3

4

5

6

7

索引数

v1 =

0

1

v2 =

0

1

2

3

4

5

v3 =

0

1

这表示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 类型

Int8Array

1

8位有符号整数

byte

signed char

Uint8Array

1

8位无符号整数

octet

unsigned char

Uint8ClampedArray

1

8位无符号整数 (clamped)

octet

unsigned char

Int16Array

2

16位有符号整数

short

short

Uint16Array

2

16位无符号整数

unsigned short

unsigned short

Int32Array

4

32位有符号整数

long

int

Uint32Array

4

32位无符号整数

unsigned long

unsigned int

Float32Array

4

32位IEEE浮点数

unrestricted float

float

Float64Array

8

64位IEEE浮点数

unrestricted double

double

玩过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.97mTest1:顺序读取速读

复制代码代码如下:

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);

});

5c07e36b871914613f6abcdf0b9a95f9.png

可见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);

}

//……

b3efa8d57acb0d82e9324cee643a71ec.png

随即读取中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);

}

//……

cfe162a1401d6212541d11d3c3014f55.png

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

cdd54f41a996fe794699509549a0b4d1.png

复制代码代码如下:

//……

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快得多。


http://www.niftyadmin.cn/n/3780520.html

相关文章

创建线程的三种方法_Java中创建线程的两个方法

1 方法1&#xff1a;新建一个类继承Threadpublic class FirstThreadTest {public static void main(String[] args) {MyThread mt new MyThread();mt.start();for (int i 1;i<10; i){System.out.println(Thread.currentThread().getName() "输出"i);}} }class …

tp路由+伪静态+去掉index.php

浏览&#xff1a;10536 发布日期&#xff1a;2013/10/08 分类&#xff1a;技术分享 关键字&#xff1a; 路由 伪静态 去掉index.php之前一个网友说能不能达到这样的效果,www.olcms.com/news/id.html我当时说不能&#xff0c;后来想了想是可以的&#xff0c;今天试了试&#x…

EXT.NET GridPanel 鼠标经过时字体加粗以及改变颜色

2019独角兽企业重金招聘Python工程师标准>>> .x-grid-row-over .x-grid-cell-inner { font-weight: bold; background-color: #C1FFC1; } 转载于:https://my.oschina.net/u/2446847/blog/1536309

2020年计算机网络成就有哪些,高通CES分享最新成就,2020年将会是5G关键一年

[PConline 资讯]高通作为知名网络通讯技术企业&#xff0c;致力于将更多先进的通讯技术带给用户。在2020年的CES大会上&#xff0c;高通召开新闻发布会&#xff0c;详细回顾了这一年多来取得的成就&#xff0c;分享了在移动、PC、汽车、边缘云领域的进展&#xff0c;同时也聚焦…

lnk200无法解析的外部符号_Java File I/O 中的Path核心接口及外部存储扩展

Path相关核心API1、Paths作为工具类&#xff0c;简化Path的创建过程。通过FileSystem创建平台相关的Path。2、FileSystems作为工具类&#xff0c;简化FileSystemProvider&#xff0c;以及相应FileSystem的创建过程。1)获取默认系统参数、Uri、Path的FileSystemProvider2)通过pr…

u盘装系统学计算机好,用U盘快速装电脑系统详细教程,几分钟就装完!

大家好&#xff0c;我是学姐。今天是正月十五&#xff0c;祝大家元宵节快乐&#xff01;今晚据说还有超级大月亮&#xff0c;在23时54分&#xff0c;大家别忘了看月亮哈。好啦&#xff0c;不说了&#xff0c;再说就跑题了&#xff0c;还是跟大家聊聊正事吧&#xff01;昨天学姐…

java Web监听器导图详解

监听器是JAVA Web开发中很重要的内容&#xff0c;其中涉及到的知识&#xff0c;可以参考下面导图&#xff1a; Web监听器 1 什么是web监听器&#xff1f; web监听器是一种Servlet中的特殊的类&#xff0c;它们能帮助开发者监听web中的特定事件&#xff0c;比如ServletContext,H…

发布成功 html,发布成功页.html

&#xfeff;发布成功页$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resources/reload.html; …