mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
update text
This commit is contained in:
parent
5e71c78b5b
commit
a77e997910
@ -14,9 +14,9 @@
|
||||
|
||||
**(3)`DataView`视图**:可以自定义复合格式的视图,比如第一个字节是 Uint8(无符号 8 位整数)、第二、三个字节是 Int16(16 位整数)、第四个字节开始是 Float32(32 位浮点数)等等,此外还可以自定义字节序。
|
||||
|
||||
简单说,`ArrayBuffer`对象代表原始的二进制数据,TypedArray 视图用来读写简单类型的二进制数据,`DataView`视图用来读写复杂类型的二进制数据。
|
||||
简单说,`ArrayBuffer`对象代表原始的二进制数据,`TypedArray`视图用来读写简单类型的二进制数据,`DataView`视图用来读写复杂类型的二进制数据。
|
||||
|
||||
TypedArray 视图支持的数据类型一共有 9 种(`DataView`视图支持除`Uint8C`以外的其他 8 种)。
|
||||
`TypedArray`视图支持的数据类型一共有 9 种(`DataView`视图支持除`Uint8C`以外的其他 8 种)。
|
||||
|
||||
| 数据类型 | 字节长度 | 含义 | 对应的 C 语言类型 |
|
||||
| -------- | -------- | -------------------------------- | ----------------- |
|
||||
@ -64,7 +64,7 @@ dataView.getUint8(0) // 0
|
||||
|
||||
上面代码对一段 32 字节的内存,建立`DataView`视图,然后以不带符号的 8 位整数格式,从头读取 8 位二进制数据,结果得到 0,因为原始内存的`ArrayBuffer`对象,默认所有位都是 0。
|
||||
|
||||
另一种 TypedArray 视图,与`DataView`视图的一个区别是,它不是一个构造函数,而是一组构造函数,代表不同的数据格式。
|
||||
另一种`TypedArray`视图,与`DataView`视图的一个区别是,它不是一个构造函数,而是一组构造函数,代表不同的数据格式。
|
||||
|
||||
```javascript
|
||||
const buffer = new ArrayBuffer(12);
|
||||
@ -79,7 +79,7 @@ x1[0] // 2
|
||||
|
||||
上面代码对同一段内存,分别建立两种视图:32 位带符号整数(`Int32Array`构造函数)和 8 位不带符号整数(`Uint8Array`构造函数)。由于两个视图对应的是同一段内存,一个视图修改底层内存,会影响到另一个视图。
|
||||
|
||||
TypedArray 视图的构造函数,除了接受`ArrayBuffer`实例作为参数,还可以接受普通数组作为参数,直接分配内存生成底层的`ArrayBuffer`实例,并同时完成对这段内存的赋值。
|
||||
`TypedArray`视图的构造函数,除了接受`ArrayBuffer`实例作为参数,还可以接受普通数组作为参数,直接分配内存生成底层的`ArrayBuffer`实例,并同时完成对这段内存的赋值。
|
||||
|
||||
```javascript
|
||||
const typedArray = new Uint8Array([0,1,2]);
|
||||
@ -89,7 +89,7 @@ typedArray[0] = 5;
|
||||
typedArray // [5, 1, 2]
|
||||
```
|
||||
|
||||
上面代码使用 TypedArray 视图的`Uint8Array`构造函数,新建一个不带符号的 8 位整数视图。可以看到,`Uint8Array`直接使用普通数组作为参数,对底层内存的赋值同时完成。
|
||||
上面代码使用`TypedArray`视图的`Uint8Array`构造函数,新建一个不带符号的 8 位整数视图。可以看到,`Uint8Array`直接使用普通数组作为参数,对底层内存的赋值同时完成。
|
||||
|
||||
### ArrayBuffer.prototype.byteLength
|
||||
|
||||
@ -128,7 +128,7 @@ const newBuffer = buffer.slice(0, 3);
|
||||
|
||||
### ArrayBuffer.isView()
|
||||
|
||||
`ArrayBuffer`有一个静态方法`isView`,返回一个布尔值,表示参数是否为`ArrayBuffer`的视图实例。这个方法大致相当于判断参数,是否为 TypedArray 实例或`DataView`实例。
|
||||
`ArrayBuffer`有一个静态方法`isView`,返回一个布尔值,表示参数是否为`ArrayBuffer`的视图实例。这个方法大致相当于判断参数,是否为`TypedArray`实例或`DataView`实例。
|
||||
|
||||
```javascript
|
||||
const buffer = new ArrayBuffer(8);
|
||||
@ -142,9 +142,9 @@ ArrayBuffer.isView(v) // true
|
||||
|
||||
### 概述
|
||||
|
||||
`ArrayBuffer`对象作为内存区域,可以存放多种类型的数据。同一段内存,不同数据有不同的解读方式,这就叫做“视图”(view)。`ArrayBuffer`有两种视图,一种是 TypedArray 视图,另一种是`DataView`视图。前者的数组成员都是同一个数据类型,后者的数组成员可以是不同的数据类型。
|
||||
`ArrayBuffer`对象作为内存区域,可以存放多种类型的数据。同一段内存,不同数据有不同的解读方式,这就叫做“视图”(view)。`ArrayBuffer`有两种视图,一种是`TypedArray`视图,另一种是`DataView`视图。前者的数组成员都是同一个数据类型,后者的数组成员可以是不同的数据类型。
|
||||
|
||||
目前,TypedArray 视图一共包括 9 种类型,每一种视图都是一种构造函数。
|
||||
目前,`TypedArray`视图一共包括 9 种类型,每一种视图都是一种构造函数。
|
||||
|
||||
- **`Int8Array`**:8 位有符号整数,长度 1 个字节。
|
||||
- **`Uint8Array`**:8 位无符号整数,长度 1 个字节。
|
||||
@ -156,7 +156,7 @@ ArrayBuffer.isView(v) // true
|
||||
- **`Float32Array`**:32 位浮点数,长度 4 个字节。
|
||||
- **`Float64Array`**:64 位浮点数,长度 8 个字节。
|
||||
|
||||
这 9 个构造函数生成的数组,统称为 TypedArray 视图。它们很像普通数组,都有`length`属性,都能用方括号运算符(`[]`)获取单个元素,所有数组的方法,在它们上面都能使用。普通数组与 TypedArray 数组的差异主要在以下方面。
|
||||
这 9 个构造函数生成的数组,统称为`TypedArray`视图。它们很像普通数组,都有`length`属性,都能用方括号运算符(`[]`)获取单个元素,所有数组的方法,在它们上面都能使用。普通数组与 TypedArray 数组的差异主要在以下方面。
|
||||
|
||||
- TypedArray 数组的所有成员,都是同一种类型。
|
||||
- TypedArray 数组的成员是连续的,不会有空位。
|
||||
@ -207,7 +207,7 @@ const i16 = new Int16Array(buffer, 1);
|
||||
|
||||
上面代码中,新生成一个 8 个字节的`ArrayBuffer`对象,然后在这个对象的第一个字节,建立带符号的 16 位整数视图,结果报错。因为,带符号的 16 位整数需要两个字节,所以`byteOffset`参数必须能够被 2 整除。
|
||||
|
||||
如果想从任意字节开始解读`ArrayBuffer`对象,必须使用`DataView`视图,因为 TypedArray 视图只提供 9 种固定的解读格式。
|
||||
如果想从任意字节开始解读`ArrayBuffer`对象,必须使用`DataView`视图,因为`TypedArray`视图只提供 9 种固定的解读格式。
|
||||
|
||||
**(2)TypedArray(length)**
|
||||
|
||||
@ -224,7 +224,7 @@ f64a[2] = f64a[0] + f64a[1];
|
||||
|
||||
**(3)TypedArray(typedArray)**
|
||||
|
||||
TypedArray 数组的构造函数,可以接受另一个 TypedArray 实例作为参数。
|
||||
TypedArray 数组的构造函数,可以接受另一个`TypedArray`实例作为参数。
|
||||
|
||||
```javascript
|
||||
const typedArray = new Int8Array(new Uint8Array(4));
|
||||
@ -260,15 +260,15 @@ y[0] // 2
|
||||
|
||||
**(4)TypedArray(arrayLikeObject)**
|
||||
|
||||
构造函数的参数也可以是一个普通数组,然后直接生成 TypedArray 实例。
|
||||
构造函数的参数也可以是一个普通数组,然后直接生成`TypedArray`实例。
|
||||
|
||||
```javascript
|
||||
const typedArray = new Uint8Array([1, 2, 3, 4]);
|
||||
```
|
||||
|
||||
注意,这时 TypedArray 视图会重新开辟内存,不会在原数组的内存上建立视图。
|
||||
注意,这时`TypedArray`视图会重新开辟内存,不会在原数组的内存上建立视图。
|
||||
|
||||
上面代码从一个普通的数组,生成一个 8 位无符号整数的 TypedArray 实例。
|
||||
上面代码从一个普通的数组,生成一个 8 位无符号整数的`TypedArray`实例。
|
||||
|
||||
TypedArray 数组也可以转换回普通数组。
|
||||
|
||||
@ -435,6 +435,7 @@ function getPlatformEndianness() {
|
||||
```javascript
|
||||
Int8Array.BYTES_PER_ELEMENT // 1
|
||||
Uint8Array.BYTES_PER_ELEMENT // 1
|
||||
Uint8ClampedArray.BYTES_PER_ELEMENT // 1
|
||||
Int16Array.BYTES_PER_ELEMENT // 2
|
||||
Uint16Array.BYTES_PER_ELEMENT // 2
|
||||
Int32Array.BYTES_PER_ELEMENT // 4
|
||||
@ -443,7 +444,7 @@ Float32Array.BYTES_PER_ELEMENT // 4
|
||||
Float64Array.BYTES_PER_ELEMENT // 8
|
||||
```
|
||||
|
||||
这个属性在 TypedArray 实例上也能获取,即有`TypedArray.prototype.BYTES_PER_ELEMENT`。
|
||||
这个属性在`TypedArray`实例上也能获取,即有`TypedArray.prototype.BYTES_PER_ELEMENT`。
|
||||
|
||||
### ArrayBuffer 与字符串的互相转换
|
||||
|
||||
@ -542,7 +543,7 @@ uint8c[0] // 0
|
||||
|
||||
### TypedArray.prototype.buffer
|
||||
|
||||
TypedArray 实例的`buffer`属性,返回整段内存区域对应的`ArrayBuffer`对象。该属性为只读属性。
|
||||
`TypedArray`实例的`buffer`属性,返回整段内存区域对应的`ArrayBuffer`对象。该属性为只读属性。
|
||||
|
||||
```javascript
|
||||
const a = new Float32Array(64);
|
||||
@ -622,7 +623,7 @@ b.byteLength // 2
|
||||
|
||||
### TypedArray.prototype.slice()
|
||||
|
||||
TypeArray 实例的`slice`方法,可以返回一个指定位置的新的 TypedArray 实例。
|
||||
TypeArray 实例的`slice`方法,可以返回一个指定位置的新的`TypedArray`实例。
|
||||
|
||||
```javascript
|
||||
let ui8 = Uint8Array.of(0, 1, 2);
|
||||
@ -636,7 +637,7 @@ ui8.slice(-1)
|
||||
|
||||
### TypedArray.of()
|
||||
|
||||
TypedArray 数组的所有构造函数,都有一个静态方法`of`,用于将参数转为一个 TypedArray 实例。
|
||||
TypedArray 数组的所有构造函数,都有一个静态方法`of`,用于将参数转为一个`TypedArray`实例。
|
||||
|
||||
```javascript
|
||||
Float32Array.of(0.151, -8, 3.7)
|
||||
@ -661,14 +662,14 @@ tarr[2] = 3;
|
||||
|
||||
### TypedArray.from()
|
||||
|
||||
静态方法`from`接受一个可遍历的数据结构(比如数组)作为参数,返回一个基于这个结构的 TypedArray 实例。
|
||||
静态方法`from`接受一个可遍历的数据结构(比如数组)作为参数,返回一个基于这个结构的`TypedArray`实例。
|
||||
|
||||
```javascript
|
||||
Uint16Array.from([0, 1, 2])
|
||||
// Uint16Array [ 0, 1, 2 ]
|
||||
```
|
||||
|
||||
这个方法还可以将一种 TypedArray 实例,转为另一种。
|
||||
这个方法还可以将一种`TypedArray`实例,转为另一种。
|
||||
|
||||
```javascript
|
||||
const ui16 = Uint16Array.from(Uint8Array.of(0, 1, 2));
|
||||
@ -719,7 +720,7 @@ struct someStruct {
|
||||
|
||||
如果一段数据包括多种类型(比如服务器传来的 HTTP 数据),这时除了建立`ArrayBuffer`对象的复合视图以外,还可以通过`DataView`视图进行操作。
|
||||
|
||||
`DataView`视图提供更多操作选项,而且支持设定字节序。本来,在设计目的上,`ArrayBuffer`对象的各种 TypedArray 视图,是用来向网卡、声卡之类的本机设备传送数据,所以使用本机的字节序就可以了;而`DataView`视图的设计目的,是用来处理网络设备传来的数据,所以大端字节序或小端字节序是可以自行设定的。
|
||||
`DataView`视图提供更多操作选项,而且支持设定字节序。本来,在设计目的上,`ArrayBuffer`对象的各种`TypedArray`视图,是用来向网卡、声卡之类的本机设备传送数据,所以使用本机的字节序就可以了;而`DataView`视图的设计目的,是用来处理网络设备传来的数据,所以大端字节序或小端字节序是可以自行设定的。
|
||||
|
||||
`DataView`视图本身也是构造函数,接受一个`ArrayBuffer`对象作为参数,生成视图。
|
||||
|
||||
@ -734,7 +735,7 @@ const buffer = new ArrayBuffer(24);
|
||||
const dv = new DataView(buffer);
|
||||
```
|
||||
|
||||
`DataView`实例有以下属性,含义与 TypedArray 实例的同名方法相同。
|
||||
`DataView`实例有以下属性,含义与`TypedArray`实例的同名方法相同。
|
||||
|
||||
- `DataView.prototype.buffer`:返回对应的 ArrayBuffer 对象
|
||||
- `DataView.prototype.byteLength`:返回占据的内存字节长度
|
||||
|
@ -774,7 +774,7 @@ obj.bar() // bar
|
||||
class MyClass {}
|
||||
```
|
||||
|
||||
上面代码排除`了TExample`的`foo`方法和`bar`方法,为`baz`方法起了别名`exampleBaz`。
|
||||
上面代码排除了`TExample`的`foo`方法和`bar`方法,为`baz`方法起了别名`exampleBaz`。
|
||||
|
||||
`as`方法则为上面的代码提供了另一种写法。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user