从来没有一蹴而就的成功,所有熠熠闪光的背后都是默默的努力。
今日学习内容
1、JS红皮书P159-162 第六章:集合引用类型
今日笔记
1、边界情况:DataView 完成读、写操作的前提是必须有充足的缓冲区,否则就会抛出 RangeError:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const buf = new ArrayBuffer(6); const view = new DataView(buf);
view.getInt32(4);
view.getInt32(8);
view.getInt32(-1);
view.setInt32(4, 123);
|
DataView 在写入缓冲里会尽最大努力把一个值转换为适当的类型,后备为 0。如果无法转换,则抛出错误:
1 2 3 4 5 6 7 8 9 10
| const buf = new ArrayBuffer(1); const view = new DataView(buf); view.setInt8(0, 1.5); alert(view.getInt8(0)); view.setInt8(0, [4]); alert(view.getInt8(0)); view.setInt8(0, 'f'); alert(view.getInt8(0)); view.setInt8(0, Symbol());
|
2、定型数组: 定型数组是另一种形式的 ArrayBuffer 视图。虽然概念上与 DataView 接近,但定型数组的区别在于,它特定于一种 ElementType 且遵循系统原生的字节序。相应地,定型数组提供了适用面更广的API 和更高的性能。设计定型数组的目的就是提高与 WebGL 等原生库交换二进制数据的效率。由于定型数组的二进制表示对操作系统而言是一种容易使用的格式,JavaScript 引擎可以重度优化算术运算、按位运算和其他对定型数组的常见操作,因此使用它们速度极快。
创建定型数组的方式包括读取已有的缓冲、使用自有缓冲、填充可迭代结构,以及填充基于任意类型的定型数组。另外,通过.from()和.of()也可以创建定型数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| const buf = new ArrayBuffer(12);
const ints = new Int32Array(buf);
alert(ints.length);
const ints2 = new Int32Array(6);
alert(ints2.length);
alert(ints2.buffer.byteLength);
const ints3 = new Int32Array([2, 4, 6, 8]); alert(ints3.length); alert(ints3.buffer.byteLength); alert(ints3[2]);
const ints4 = new Int16Array(ints3);
alert(ints4.length); alert(ints4.buffer.byteLength); alert(ints4[2]);
const ints5 = Int16Array.from([3, 5, 7, 9]); alert(ints5.length); alert(ints5.buffer.byteLength); alert(ints5[2]);
const floats = Float32Array.of(3.14, 2.718, 1.618); alert(floats.length); alert(floats.buffer.byteLength); alert(floats[2]);
|
3、下溢和上溢:定型数组中值的下溢和上溢不会影响到其他索引,但仍然需要考虑数组的元素应该是什么类型。定型数组对于可以存储的每个索引只接受一个相关位,而不考虑它们对实际数值的影响。以下代码演示了如何处理下溢和上溢:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
const ints = new Int8Array(2);
const unsignedInts = new Uint8Array(2);
unsignedInts[1] = 256; console.log(unsignedInts); unsignedInts[1] = 511; console.log(unsignedInts);
unsignedInts[1] = -1 console.log(unsignedInts);
ints[1] = 128; console.log(ints);
ints[1] = 255; console.log(ints);
|