1
1
# 二进制数组
2
2
3
- 二进制数组(ArrayBuffer对象、TypedArray视图和DataView视图)是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格,ES6将它们纳入了ECMAScript规格,并且增加了新的方法。
3
+ 二进制数组(ArrayBuffer对象、TypedArray视图和DataView视图)是JavaScript操作二进制数据的一个接口。这些对象早就存在,属于独立的规格(2011年2月发布) ,ES6将它们纳入了ECMAScript规格,并且增加了新的方法。
4
4
5
5
这个接口的原始设计目的,与WebGL项目有关。所谓WebGL,就是指浏览器与显卡之间的通信接口,为了满足JavaScript与显卡之间大量的、实时的数据交换,它们之间的数据通信必须是二进制的,而不能是传统的文本格式。文本格式传递一个32位整数,两端的JavaScript脚本与显卡都要进行格式转化,将非常耗时。这时要是存在一种机制,可以像C语言那样,直接操作字节,将4个字节的32位整数,以二进制形式原封不动地送入显卡,脚本的性能就会大幅提升。
6
6
@@ -464,7 +464,7 @@ function str2ab(str) {
464
464
465
465
不同的视图类型,所能容纳的数值范围是确定的。超出这个范围,就会出现溢出。
466
466
467
- TypedArray数组对于溢出,采用的处理方法是求余值。正向溢出(overflow)等于,当前数据类型的最小值加上余值 ,再减去1;负向溢出(underflow)等于当前数据类型的最大值减去余值,再加上1。
467
+ TypedArray数组对于溢出,采用的处理方法是求余值。正向溢出(overflow)的含义是输入值大于当前数据类型的最大值,最后得到的值就等于当前数据类型的最小值加上余值 ,再减去1;负向溢出(underflow)等于当前数据类型的最大值减去余值,再加上1。
468
468
469
469
``` javascript
470
470
var uint8 = new Uint8Array (1 );
@@ -476,7 +476,7 @@ uint8[0] = -1;
476
476
uint8[0 ] // 255
477
477
```
478
478
479
- 上面例子中,8位无符号整数的数值范围是0到255,超出这个范围,就是溢出。256相当于正向溢出1,回到最小值0 ;-1相当于负向溢出1,回到最大值255 。
479
+ 上面例子中,8位无符号整数的数值范围是0到255,超出这个范围,就是溢出。256相当于正向溢出1,即余值为1,最后的值等于0( ` 0 + 1 -1 ` ) ;-1相当于负向溢出1,余值也为1,最后的值等于255( ` 255 - 1 + 1 ` ) 。
480
480
481
481
下面是8位带符号整数的例子。
482
482
@@ -609,6 +609,22 @@ Float32Array.of(0.151, -8, 3.7)
609
609
// Float32Array [ 0.151, -8, 3.7 ]
610
610
```
611
611
612
+ 下面三种方法都会生成同样一个TypedArray数组。
613
+
614
+ ``` javascript
615
+ // 方法一
616
+ let tarr = new Uint8Array ([1 ,2 ,3 ]);
617
+
618
+ // 方法二
619
+ let tarr = Uint8Array .of (1 ,2 ,3 );
620
+
621
+ // 方法三
622
+ let tarr = new Uint8Array (3 );
623
+ tarr[0 ] = 0 ;
624
+ tarr[1 ] = 1 ;
625
+ tarr[2 ] = 2 ;
626
+ ```
627
+
612
628
### TypedArray.from()
613
629
614
630
静态方法` from ` 接受一个可遍历的数据结构(比如数组)作为参数,返回一个基于这个结构的TypedArray实例。
@@ -883,7 +899,7 @@ reader.onload = function () {
883
899
};
884
900
```
885
901
886
- 下面以处理bmp文件为例。假定file变量是一个指向bmp文件的文件对象 ,首先读取文件。
902
+ 下面以处理bmp文件为例。假定 ` file ` 变量是一个指向bmp文件的文件对象 ,首先读取文件。
887
903
888
904
``` javascript
889
905
var reader = new FileReader ();
0 commit comments