DataView
视图提供了一个与平台中字节在内存中的排列顺序(字节序)无关的从ArrayBuffer
读写多数字类型的底层接口.
语法
new DataView(buffer [, byteOffset [, byteLength]])
参数
buffer
- 一个现有的
ArrayBuffer
,用 作DataView
实例的存储空间. byteOffset
可选- 视图实例引用的buffer的字节偏移量.如果没有指定,buffer视图会以首字节作为开始。
byteLength
可选- 字节数组中元素的个数。如果未指定,视图的长度将会以buffer的长度匹配。
返回值
一个表示指定data buffer的DataView实例
。
抛出错误
RangeError
- 如果
byteOffset
和byteLength
导致指定视图对应的 buffer 访问越界,则会抛出此错误.
描述
字节顺序
多字节数字在内存中的解释会根据系统架构表现出不同的格式,进一步解释参照Endianness。DataView的访问函数提供一个不需要考虑平台架构字节顺序的简单访问控制。
var littleEndian = (function() {
var buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
// Int16Array 使用系统自带的字节顺序
return new Int16Array(buffer)[0] === 256;
})();
console.log(littleEndian); // true or false
属性
所有DataView实例继承自 DataView.prototype
,并允许向DataView 对象添加属性。
DataView.prototype.constructor
- 指定用来生成原型的构造函数.初始化值是标准内置DataView构造器.
DataView.prototype.buffer
只读- 被视图引入的
ArrayBuffer
.创建实例的时候已固化因此是只读的. DataView.prototype.byteLength
只读- 从
ArrayBuffer
中读取的字节长度. 创建实例的时候已固化因此是只读的. DataView.prototype.byteOffset
只读- 从
ArrayBuffer
读取时的偏移字节长度. 创建实例的时候已固化因此是只读的.
方法
读
DataView.prototype.getInt8()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个8-bit数(一个字节).DataView.prototype.getUint8()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个8-bit数(无符号字节).DataView.prototype.getInt16()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个16-bit数(短整型).DataView.prototype.getUint16()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个16-bit数(无符号短整型).DataView.prototype.getInt32()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个32-bit数(长整型).DataView.prototype.getUint32()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个32-bit数(无符号长整型).DataView.prototype.getFloat32()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个32-bit数(浮点型).DataView.prototype.getFloat64()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处获取一个64-bit数(双精度浮点型).
写
DataView.prototype.setInt8()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个8-bit数(一个字节).DataView.prototype.setUint8()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个8-bit数(无符号字节).DataView.prototype.setInt16()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个16-bit数(短整型).DataView.prototype.setUint16()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个16-bit数(无符号短整型).DataView.prototype.setInt32()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个32-bit数(长整型).DataView.prototype.setUint32()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个32-bit数(无符号长整型).DataView.prototype.setFloat32()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个32-bit数(浮点型).DataView.prototype.setFloat64()
从
DataView
起始位置以byte为计数的指定偏移量(byteOffset)处储存一个64-bit数(双精度浮点型).
示例
var buffer = new ArrayBuffer(16); var dv = new DataView(buffer, 0); dv.setInt16(1, 42); dv.getInt16(1); //42
规范
规范名称 | 状态 | 注释 |
---|---|---|
Typed Array Specification | Obsolete | 被 ECMAScript 6 取代 |
ECMAScript 2015 (6th Edition, ECMA-262) DataView |
Standard | Initial definition in an ECMA standard. |
ECMAScript Latest Draft (ECMA-262) DataView |
Draft |
浏览器兼容性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
基本支持 | 9.0 | 15.0 (15.0) | 10 | 12.1 | 5.1 |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
基本支持 | 4.0 | (Yes) | 15.0 (15) | ? | 12.0 | 4.2 |
Firefox-specific notes
从 Gecko / SpiderMonkey 40 (Firefox 40 / Thunderbird 40 / SeaMonkey 2.37) 开始, DataView
要求使用 new
操作符构造。 仅调用 DataView()
而不使用 new 操作符将会抛出一个 TypeError
。
var dv = DataView(buffer, 0); // TypeError: calling a builtin DataView constructor without new is forbidden
var dv = new DataView(buffer, 0);
相关链接
- jDataView: 用于扩展
DataView
API 并能适配所有浏览器和 Node.js.