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 г..
* Some parts of this feature may have varying levels of support.
ÐÑедÑÑавление DataView пÑедоÑÑавлÑÐµÑ Ð½Ð¸Ð·ÐºÐ¾-ÑÑовневÑй инÑеÑÑÐµÐ¹Ñ Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð¸ запиÑи ÑазлиÑнÑÑ
ÑиÑловÑÑ
Ñипов в бинаÑном ArrayBuffer, незавиÑимо Ð¾Ñ Ð¿Ð¾ÑÑдка байÑов плаÑÑоÑмÑ.
ÐпиÑание
>ÐоÑÑдок байÑов
ÐногобайÑовÑе ÑиÑловÑе ÑоÑмаÑÑ Ð¿ÑедÑÑавлÑÑÑÑÑ Ð² памÑÑи по-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð² завиÑимоÑÑи Ð¾Ñ Ð°ÑÑ
иÑекÑÑÑÑ Ð¼Ð°ÑÐ¸Ð½Ñ (ÑмоÑÑиÑе Endianness Ð´Ð»Ñ Ð¾Ð±ÑÑÑнениÑ). ÐеÑÐ¾Ð´Ñ Ð´Ð¾ÑÑÑпа DataView пÑедоÑÑавлÑÑÑ ÑвнÑй ÑпоÑоб обÑаÑÐµÐ½Ð¸Ñ Ðº даннÑм вне завиÑимоÑÑи Ð¾Ñ Ð¿Ð¾ÑÑдка байÑов плаÑÑоÑмÑ.
const littleEndian = (() => {
const buffer = new ArrayBuffer(2);
new DataView(buffer).setInt16(0, 256, true /* littleEndian */);
// 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, Ñего доÑÑаÑоÑно в болÑÑинÑÑве ÑлÑÑаев.
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 вÑегда бÑÐ´ÐµÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ медленнее, Ñем 32-биÑнÑÑ
ÑелÑÑ
ÑиÑел, из-за Ñ
аÑакÑеÑа иÑ
пеÑеменного ÑазмеÑа в JavaScript.
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 и еÑÑÑ Ñ Ð²ÑеÑ
ÑкземплÑÑов DataView.
DataView.prototype.buffer-
ArrayBuffer, ÑвÑзаннÑй Ñ Ð¿ÑедÑÑавлением. УÑÑанавливаеÑÑÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ доÑÑÑпно ÑолÑко Ð´Ð»Ñ ÑÑениÑ. DataView.prototype.byteLength-
Ð Ð°Ð·Ð¼ÐµÑ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² байÑÐ°Ñ . УÑÑанавливаеÑÑÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ доÑÑÑпно ÑолÑко Ð´Ð»Ñ ÑÑениÑ.
DataView.prototype.byteOffset-
СмеÑение пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² байÑÐ°Ñ Ð¾Ñ Ð½Ð°Ñала его
ArrayBuffer. УÑÑанавливаеÑÑÑ Ð² Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸ доÑÑÑпно ÑолÑко Ð´Ð»Ñ ÑÑениÑ. DataView.prototype.constructor-
ФÑнкÑиÑ-конÑÑÑÑкÑоÑ, ÑоздаÑÑÐ°Ñ ÑкземплÑÑ Ð¾Ð±ÑекÑа. ÐÐ»Ñ ÑкземплÑÑов
DataViewнаÑалÑнÑм знаÑением ÑвлÑеÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑDataView. DataView.prototype[@@toStringTag]-
ÐаÑалÑнÑм знаÑением ÑвойÑÑва
@@toStringTagÑвлÑеÑÑÑ ÑÑÑока"DataView". ÐÑо ÑвойÑÑво иÑполÑзÑеÑÑÑ Ð²Object.prototype.toString().
ÐеÑÐ¾Ð´Ñ ÑкземплÑÑа
DataView.prototype.getBigInt64()-
ЧиÑÐ°ÐµÑ 8 байÑов наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 64-биÑное знаковое Ñелое ÑиÑло. DataView.prototype.getBigUint64()-
ЧиÑÐ°ÐµÑ 8 байÑов наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 64-биÑное беззнаковое Ñелое ÑиÑло. DataView.prototype.getFloat32()-
ЧиÑÐ°ÐµÑ 4 байÑа наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 32-биÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой. DataView.prototype.getFloat64()-
ЧиÑÐ°ÐµÑ 8 байÑов наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 64-биÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой. DataView.prototype.getInt16()-
ЧиÑÐ°ÐµÑ 2 байÑа наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 16-биÑное знаковое Ñелое ÑиÑло. DataView.prototype.getInt32()-
ЧиÑÐ°ÐµÑ 4 байÑа наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 32-биÑное знаковое Ñелое ÑиÑло. DataView.prototype.getInt8()-
ЧиÑÐ°ÐµÑ 1 Ð±Ð°Ð¹Ñ Ð½Ð°ÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ ÐµÐ³Ð¾ как 8-биÑное знаковое Ñелое ÑиÑло. DataView.prototype.getUint16()-
ЧиÑÐ°ÐµÑ 2 байÑа наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 16-биÑное беззнаковое Ñелое ÑиÑло. DataView.prototype.getUint32()-
ЧиÑÐ°ÐµÑ 4 байÑа наÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ Ð¸Ñ ÐºÐ°Ðº 32-биÑное беззнаковое Ñелое ÑиÑло. DataView.prototype.getUint8()-
ЧиÑÐ°ÐµÑ 1 Ð±Ð°Ð¹Ñ Ð½Ð°ÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataViewи инÑеÑпÑеÑиÑÑÐµÑ ÐµÐ³Ð¾ как 8-биÑное беззнаковое Ñелое ÑиÑло. DataView.prototype.setBigInt64()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ BigInt и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 64-биÑное знаковое Ñелое ÑиÑло в 8 байÑÐ°Ñ Ð½Ð°ÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setBigUint64()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ BigInt и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 64-биÑное беззнаковое Ñелое ÑиÑло в 8 байÑÐ°Ñ Ð½Ð°ÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setFloat32()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 32-биÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой в 4 байÑÐ°Ñ Ð½Ð°ÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setFloat64()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 64-биÑное ÑиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой в 8 байÑÐ°Ñ Ð½Ð°ÑÐ¸Ð½Ð°Ñ Ñ Ñказанного ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setInt16()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 16-биÑное знаковое Ñелое ÑиÑло в 2 байÑÐ°Ñ Ð¿Ð¾ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setInt32()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 32-биÑное знаковое Ñелое ÑиÑло в 4 байÑÐ°Ñ Ð¿Ð¾ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setInt8()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 8-биÑное знаковое Ñелое ÑиÑло в байÑе по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setUint16()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 16-биÑное беззнаковое Ñелое ÑиÑло в 2 байÑÐ°Ñ Ð¿Ð¾ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setUint32()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 32-биÑное беззнаковое Ñелое ÑиÑло в 4 байÑÐ°Ñ Ð¿Ð¾ ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView. DataView.prototype.setUint8()-
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑло и ÑÐ¾Ñ ÑанÑÐµÑ ÐµÐ³Ð¾ как 8-биÑное беззнаковое Ñелое ÑиÑло в байÑе по ÑÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¼Ñ ÑмеÑÐµÐ½Ð¸Ñ ÑÑого
DataView.
ÐÑимеÑÑ
>ÐÑполÑзование DataView
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer, 0);
view.setInt16(1, 42);
view.getInt16(1); // 42
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-dataview-objects> |