【javascript】类型化数组

很久很久以前,有一个叫Array的魔王占领着javascript的数组宝座,垄断了一切形式的数组。它能屈能伸,功能齐全,也不挑食,什么类型的数据都吃。

直到有一天,ArrayBuffer家族踏上了这片土地,Array的安宁被打破了。

ArrayBuffer家里有一大群兄弟姐妹,名字叫 Float32Array Float64Array Int8Array Int16Array Int32Array Uint8Array Uint16Array Uint32Array (还有和数组没关系的就不写了)。他们来找Array挑战:
Array:我能力超强!
ArrayBuffers:我们效率高

Array:我功能齐全!
ArrayBuffers:我们效率高

Array:我声明简单!
ArrayBuffers:我们效率高

Array:我屮艸芔茻!
ArrayBuffers:我们效率高

算了还是回主题吧。。编不下去了。。。
类型化数组是已经存在了不少时间的“新”数组类型了,因为它是类型化数组,所以它的效率不用质疑肯定比Array对象要高很多,适合用来做计算量很大的多数字操作,比如矩阵计算。也可以单纯用来节省内存开销,如果你已经知道数据会在什么范围,那么可以尽可能选择位数少的类型话数组,这样在存储相同的数字时,一般是比Array节省内存的。

类型化数组实质上都是ArrayBuffer的扩充,也就是除了ArrayBuffer,再加上几个可以标识特殊身份的属性,不同的ArrayBuffer也就有了不一样的属性和用处。比如列一下 Uint8Array Uint32Array的属性可以看到

新建一个类型化数组可以这样

也可以这样

如果给类型化数组的数字超出了它的数据范围,那就会数位溢出,像这样

访问其中的数据和Array是一样的

正是因为类型化数组在生成的时候就开辟了一块连续的内存空间,不像Array有索引和字典两种存放模式,所以其效率才会比Array高。

类型化数组的缺点就是
·既然类型化了那就只能放指定类型的数据,不能把对象什么的放在里面,更不能用多维数组了
·不能像Array那样随便删除和添加元素,也就是不能直接伸长缩短,但是可以手动把两个数组合并成1个新的长数组,也可以从一个数组里提一块出来成为一个新数组
·在IntArray里超出数据范围不会像普通的数字变量一样变成Infinity,而是0

数组取段
类型化数组都有一个subarray方法,可以把数组里的某一段取出来,变成一个新的数组

输出的数组和原本的数组类型一样

拼接两个数组
类型化数组不可以直接伸长,因为他的大小在创建的时候就定死了,这时我们想要增加这个数组的长度,可以这么做

参考:
·巨硬的文档
·如何高大上地凑博文





如文中无特殊说明,本站均使用以下协议:知识共享许可协议
知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

本博客使用Disqus评论系统,如果看不到评论框,请尝试爬墙。