# cloneDataView
# Description
DataView
视图是一个可以从 二进制 ArrayBuffer 对象中读写多种数值类型的底层接口,使用它时,不用考虑不同平台的字节序问题。
# Params
(dataView, isDeep)
# Return
{Object} dataView
# Depend
import cloneArrayBuffer from './cloneArrayBuffer.js'
# Code
function cloneDataView(dataView, isDeep) {
const buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength)
}
# Analyze
DataView.prototype.constructor
指定用来生成原型的构造函数。初始化值是标准内置 DataView 构造器.DataView.prototype.byteOffset
从 ArrayBuffer读取时的偏移字节长度。创建实例的时候已固化因此是只读的.DataView.prototype.byteLength
从 ArrayBuffer中读取的字节长度。创建实例的时候已固化因此是只读的DataView.prototype.buffer
被视图引入的 ArrayBuffer. 创建实例的时候已固化因此是只读的.- 如果传入了 isDeep 则使用 cloneArrayBuffer 重新开辟内存空间,返回新的 buffer,否则的话使用 dataView.buffer
- new 一个 新的 dataView , 偏移量和字节长度跟传入的 dataView 保持一致
# 关于 arrayBuffer 还有 TypedArray 可查看 ArrayBuffer,二进制数组 (opens new window)
# Remark
# Example
const a = new Uint8Array([1,2,3,4]).buffer
const b = new DataView(a, 1)
const c = cloneDataView(b, true)
const d = cloneDataView(b)
b.setUint8(1, 8)
/**
* DataView {
* byteLength: 3,
* byteOffset: 1,
* buffer: ArrayBuffer { [Uint8Contents]: <01 02 08 04>, byteLength: 4 }
* }
*
*/
console.log(b)
/**
* DataView {
* byteLength: 3,
* byteOffset: 1,
* buffer: ArrayBuffer { [Uint8Contents]: <01 02 03 04>, byteLength: 4 }
* }
*
*/
console.log(c)
/**
* DataView {
* byteLength: 3,
* byteOffset: 1,
* buffer: ArrayBuffer { [Uint8Contents]: <01 02 08 04>, byteLength: 4 }
* }
*
*/
console.log(d)