DataView
åºçº¿
广æ³å¯ç¨
*
èª 2015å¹´7æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
* æ¤ç¹æ§çæäºé¨åçæ¯æç¨åº¦å¯è½ææä¸åã
DataView è§å¾æ¯ä¸ä¸ªå¯ä»¥ä»äºè¿å¶ ArrayBuffer 对象ä¸è¯»åå¤ç§æ°å¼ç±»åçåºå±æ¥å£ï¼ä½¿ç¨å®æ¶ï¼ä¸ç¨èèä¸åå¹³å°çåèåºé®é¢ã
æè¿°
>åèåº
å¤åèçæ°åæ ¼å¼å¨å
åä¸ç表示æ¹å¼å æºå¨æ¶æèå¼ââç¸å
³çè§£é请åé
åèåºãDataView 访é®å¨ï¼accessorï¼æä¾äºå¯¹å¦ä½è®¿é®æ°æ®çæç¡®æ§å¶ï¼èä¸ç®¡æ§è¡ä»£ç çè®¡ç®æºçåèåºå¦ä½ã
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 çå¼ââè¿å¯¹äºæäºæ
åµè¶³å¤ä½¿ç¨ã
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 使´æ°è¦æ
¢å¾å¤ã
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
const buffer = new ArrayBuffer(16);
const view = new DataView(buffer, 0);
view.setInt16(1, 42);
view.getInt16(1); // 42
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-dataview-objects> |
æµè§å¨å ¼å®¹æ§
åè§
DataViewå¨core-jsä¸ç polyfill- jDataViewï¼DataView ç polyfillï¼ä½¿å
¶è½å¤ç¨äºæææµè§å¨å Node.js ç¯å¢ãåæ¶ï¼è¯¥åºè¿å¯¹
DataViewAPI è¿è¡äºä¸äºæ©å±ã ArrayBufferSharedArrayBuffer