javascript基础学习系列八十五:边界情形

本文详细介绍了JavaScript中的DataView对象如何在内存中操作ArrayBuffer,包括字节填充、不同字节序的读写,以及处理边界条件和定型数组的性能优势。同时提到了边界情况下的错误处理和定型数组的创建方法。
摘要由CSDN通过智能技术生成
// 在内存中分配两个字节并声明一个DataView const buf = new ArrayBuffer(2); const view = new DataView(buf);
// 填充缓冲,让第一位和最后一位都是1 view.setUint8(0, 0x80); // 设置最左边的位等于1 view.setUint8(1, 0x01); // 设置最右边的位等于1
// 缓冲内容(为方便阅读,人为加了空格) // 0x8 0x0 0x0 0x1
// 1000 0000 0000 0001
// 按大端字节序读取Uint16
// 0x80 是高字节,0x01 是低字节
// 0x8001 = 2^15 + 2^0 = 32768 + 1 = 32769 alert(view.getUint16(0)); // 32769
// 按小端字节序读取Uint16
// 0x01 是高字节,0x80 是低字节
// 0x0180 = 2^8 + 2^7 = 256 + 128 = 384 alert(view.getUint16(0, true)); // 384
// 按大端字节序写入Uint16 view.setUint16(0, 0x0004);
// 缓冲内容(为方便阅读,人为加了空格) // 0x0 0x0 0x0 0x4
// 0000 0000 0000 0100
    alert(view.getUint8(0)); // 0
    alert(view.getUint8(1)); // 4
// 按小端字节序写入Uint16 view.setUint16(0, 0x0002, true);
// 缓冲内容(为方便阅读,人为加了空格) // 0x0 0x2 0x0 0x0
// 0000 0010 0000 0000
    alert(view.getUint8(0)); // 2
    alert(view.getUint8(1)); // 0

1. 边界情形:

DataView 完成读、写操作的前提是必须有充足的缓冲区,否则就会抛出 RangeError:

const buf = new ArrayBuffer(6);
    const view = new DataView(buf);
// 尝试读取部分超出缓冲范围的值 view.getInt32(4);
// RangeError
// 尝试读取超出缓冲范围的值 view.getInt32(8);
// RangeError
// 尝试读取超出缓冲范围的值 view.getInt32(-1);
// RangeError
// 尝试写入超出缓冲范围的值 view.setInt32(4, 123); // RangeError
DataView 在写入缓冲里会尽最大努力把一个值转换为适当的类型,后备为 0。如果无法转换,则 抛出错误:
    const buf = new ArrayBuffer(1);
    const view = new DataView(buf);
    view.setInt8(0, 1.5);
    alert(view.getInt8(0)); // 1
    view.setInt8(0, [4]);
    alert(view.getInt8(0)); // 4
       view.setInt8(0, 'f'); 8 alert(view.getInt8(0)); // 0
    view.setInt8(0, Symbol());
    // TypeError

2. 定型数组:

定型数组是另一种形式的 ArrayBuffer 视图。虽然概念上与 DataView 接近,但定型数组的区别 在于,它特定于一种 ElementType 且遵循系统原生的字节序。相应地,定型数组提供了适用面更广的 API 和更高的性能。

设计定型数组的目的就是提高与 WebGL 等原生库交换二进制数据的效率。由于定 型数组的二进制表示对操作系统而言是一种容易使用的格式,JavaScript 引擎可以重度优化算术运算、 按位运算和其他对定型数组的常见操作,因此使用它们速度极快。

创建定型数组的方式包括读取已有的缓冲、使用自有缓冲、填充可迭代结构,以及填充基于任意类 型的定型数组。另外,通过.from()和.of()也可以创建定型数组:

// 创建一个 12 字节的缓冲
const buf = new ArrayBuffer(12);
// 创建一个引用该缓冲的Int32Array
const ints = new Int32Array(buf);
// 这个定型数组知道自己的每个元素需要 4 字节
// 因此长度为3
alert(ints.length); // 3
  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值