Movatterモバイル変換


[0]ホーム

URL:


  1. 面向开发者的 Web 技术
  2. JavaScript
  3. JavaScript 参考
  4. JavaScript 标准内置对象
  5. DataView

此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in EnglishAlways switch to English

DataView

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2015年7月⁩.

* Some parts of this feature may have varying levels of support.

DataView 视图是一个可以从二进制ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。

描述

字节序

多字节的数字格式在内存中的表示方式因机器架构而异——相关的解释请参阅字节序DataView 访问器(accessor)提供了对如何访问数据的明确控制,而不管执行代码的计算机的字节序如何。

js
const littleEndian = (() => {  const buffer = new ArrayBuffer(2);  new DataView(buffer).setInt16(0, 256, true /* 小端对齐 */);  // Int16Array 使用平台的字节序。  return new Int16Array(buffer)[0] === 256;})();console.log(littleEndian); // true 或 false

64 位整数值

某些浏览器不支持DataView.prototype.setBigInt64()DataView.prototype.setBigUint64()。因此,要在代码中启用跨浏览器的 64 位操作,你可以实现自己的getUint64() 函数,以获得精度达到Number.MAX_SAFE_INTEGER 的值——这对于某些情况足够使用。

js
function getUint64(dataview, byteOffset, littleEndian) {  // 将 64 位的数字拆分位两个 32 位(4 字节)的部分  const left = dataview.getUint32(byteOffset, littleEndian);  const right = dataview.getUint32(byteOffset + 4, littleEndian);  // 将两个 32 位的值组合在一起  const combined = littleEndian    ? left + 2 ** 32 * right    : 2 ** 32 * left + right;  if (!Number.isSafeInteger(combined))    console.warn(combined, "超过 MAX_SAFE_INTEGER。可能存在精度丢失。");  return combined;}

或者,如果你需要完整的 64 位的范围,你可以创建BigInt。此外,尽管原生 BigInt 比等效的用户态的库快得多,但由于其大小可变的性质,BigInt 始终比 JavaScript 中的 32 位整数要慢得多。

js
const BigInt = window.BigInt,  bigThirtyTwo = BigInt(32),  bigZero = BigInt(0);function getUint64BigInt(dataview, byteOffset, littleEndian) {  // 将 64 位的数字拆分位两个 32 位(4 字节)的部分  const left = BigInt(dataview.getUint32(byteOffset | 0, !!littleEndian) >>> 0);  const right = BigInt(    dataview.getUint32(((byteOffset | 0) + 4) | 0, !!littleEndian) >>> 0,  );  // 将两个 32 位的值组合在一起并返回该值  return littleEndian    ? (right << bigThirtyTwo) | left    : (left << bigThirtyTwo) | right;}

构造函数

DataView()

创建一个新的DataView 对象。

实例属性

DataView.prototype[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串"DataView"。该属性用于Object.prototype.toString()

DataView.prototype.buffer

ArrayBuffer 是引用该缓冲区的视图。在构造时会被固定,因此该属性只读

DataView.prototype.byteLength

视图的长度(以字节为单位)。在构造时会被固定,因此该属性只读

DataView.prototype.byteOffset

ArrayBuffer 的视图开始位置的字节偏移量。在构造时会被固定,因此该属性只读

实例方法

DataView.prototype.getBigInt64()

从当前DataView 的指定字节偏移处读取 8 个字节,并将其解释为 64 位有符号整数。

DataView.prototype.getBigUint64()

从当前DataView 的指定字节偏移处读取 8 个字节,并将其解释为 64 位无符号整数。

DataView.prototype.getFloat16()

从当前DataView 的指定字节偏移处读取 2 个字节,并将其解释为 16 位浮点数。

DataView.prototype.getFloat32()

从当前DataView 的指定字节偏移处读取 4 个字节,并将其解释为 32 位浮点数。

DataView.prototype.getFloat64()

从当前DataView 的指定字节偏移处读取 8 个字节,并将其解释为 64 位浮点数。

DataView.prototype.getInt16()

从当前DataView 的指定字节偏移处读取 2 个字节,并将其解释为 16 位有符号整数。

DataView.prototype.getInt32()

从当前DataView 的指定字节偏移处读取 4 个字节,并将其解释为 32 位有符号整数。

DataView.prototype.getInt8()

从当前DataView 的指定字节偏移处读取 1 个字节,并将其解释为 8 位有符号整数。

DataView.prototype.getUint16()

从当前DataView 的指定字节偏移处读取 2 个字节,并将其解释为 16 位无符号整数。

DataView.prototype.getUint32()

从当前DataView 的指定字节偏移处读取 4 个字节,并将其解释为 32 位无符号整数。

DataView.prototype.getUint8()

从当前DataView 的指定字节偏移处读取 1 个字节,并将其解释为 8 位无符号整数。

DataView.prototype.setBigInt64()

指定一个数字,并将其作为 64 位有符号整数存储在当前DataView 的指定字节偏移处的 8 个字节中。

DataView.prototype.setBigUint64()

指定一个数字,并将其作为 64 位无符号整数存储在当前DataView 的指定字节偏移处的 8 个字节中。

DataView.prototype.setFloat16()

指定一个数字,并将其作为 16 位浮点数存储在当前DataView 的指定字节偏移处的 2 个字节中。

DataView.prototype.setFloat32()

指定一个数字,并将其作为 32 位浮点数存储在当前DataView 的指定字节偏移处的 4 个字节中。

DataView.prototype.setFloat64()

指定一个数字,并将其作为 64 位浮点数存储在当前DataView 的指定字节偏移处的 8 个字节中。

DataView.prototype.setInt16()

指定一个数字,并将其作为 16 位有符号整数存储在当前DataView 的指定字节偏移处的 2 个字节中。

DataView.prototype.setInt32()

指定一个数字,并将其作为 32 位有符号整数存储在当前DataView 的指定字节偏移处的 4 个字节中。

DataView.prototype.setInt8()

指定一个数字,并将其作为 8 位有符号整数存储在当前DataView 的指定字节偏移处的 1 个字节中。

DataView.prototype.setUint16()

指定一个数字,并将其作为 16 位无符号整数存储在当前DataView 的指定字节偏移处的 2 个字节中。

DataView.prototype.setUint32()

指定一个数字,并将其作为 32 位无符号整数存储在当前DataView 的指定字节偏移处的 4 个字节中。

DataView.prototype.setUint8()

指定一个数字,并将其作为 8 位无符号整数存储在当前DataView 的指定字节偏移处的 1 个字节中。

示例

使用 DataView

js
const buffer = new ArrayBuffer(16);const view = new DataView(buffer, 0);view.setInt16(1, 42);view.getInt16(1); // 42

规范

Specification
ECMAScript® 2026 Language Specification
# sec-dataview-objects

浏览器兼容性

参见

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp