为何可使用超出ArrayBuffer大小的偏移创建Int8Array?
问题原因解析
1. 为什么创建Int8Array时未触发RangeError?
ECMAScript规范对TypedArray的构造逻辑有明确规则:
- 仅当偏移量大于缓冲区总字节数,或者偏移量不是当前TypedArray元素字节大小的整数倍时,才会抛出
RangeError。 - 对于
Int8Array,每个元素占1字节,任何整数偏移都满足对齐要求;而这里的偏移量12刚好等于缓冲区的12字节长度,属于合法范围。
此时创建的int8Array是长度为0的空TypedArray,因为可用字节数为buffer.byteLength - byteOffset = 12 - 12 = 0,除以每个元素的1字节后,最终长度为0。
2. 为什么赋值int8Array[0] = 200能执行但无实际效果?
JavaScript中,对TypedArray访问超出自身有效索引范围的位置时,不会抛出错误,但这类赋值操作完全无效:
- 由于
int8Array长度为0,不存在任何有效索引(有效索引范围是0到length-1,这里没有符合条件的索引)。 - 该赋值不会修改底层
ArrayBuffer的任何内容,你可以打印intArray的内容验证,它的数值依然是初始的0。
验证代码示例
在原代码中添加验证逻辑即可确认:
let buffer = new ArrayBuffer(12); const intArray = new Int32Array(buffer); console.log(intArray.buffer); const int8Array = new Int8Array(buffer, 12); console.log(int8Array.length); // 输出0,确认是长度为0的视图 int8Array[0] = 200; console.log(intArray); // 输出Int32Array(3) [0, 0, 0],原缓冲区未被修改 console.log(intArray.buffer);
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

