【问题标题】:Javascript ArrayBuffer- Cannot set null value to arraybufferJavascript ArrayBuffer-无法将空值设置为arraybuffer
【发布时间】:2019-10-08 15:49:24
【问题描述】:
// Creating an ArrayBuffer with a size in bytes 
var buffer = new ArrayBuffer(16); 

// Creating views 
var view1 = new DataView(buffer);

// Putting 1 in slot 0 
view1.setInt8(0, null);

console.log(view1.getInt8(0));

结果: 0

预期: null

如何设置空/空数据?我们有办法检查arraybuffer中的空数据吗?

例如:我们有一个包含如下数据的 csv 文件:

0,,1,0

非常感谢

【问题讨论】:

  • ArrayBuffer 基本上代表一个固定大小的内存块。该数组中的各种字节可以是0,但其中不可能有null 值。
  • 解析csv数据时如何设置空值,,,cool并传输其数据?
  • @TayDong:有一个固定数量的字节值。 IE。总是有 16 个字节的值。即 16 个值,每个值都在 0 到 255 之间。在这种情况下,“空”到底应该是什么?当您阅读它时,您可以解释 0 表示“空”,但这意味着您不能再表示数值 0。
  • 感谢 Joachim Sauer。如果我们将 0 标记为 null,那将是混乱的。如果数据是0,1,,0,,cool,会发生什么。这意味着我们可以显示0,null/empty
  • 您打算如何将"cool" 部分写入/编码为仅包含数字的数组?如果您的答案是 charCodes,那么您如何区分 cool,stuffcoolstuff。或者换句话说,您如何确定列的边界?

标签: javascript web-worker arraybuffer


【解决方案1】:

来自MDN ArrayBuffer docs(强调我的):

ArrayBuffer 对象用于表示一个通用的、固定长度的 原始二进制数据缓冲区。

即 ArrayBuffers 仅保存二进制(数字)值。出于这个原因,DataView API 将只允许您设置浮点或整数值。但是,null 不是数字。是 JS 的primitive values 之一。

您可以在 EcmaScript 规范中进一步看到这一点,在您拥有的抽象 SetValueInBuffer 操作的第 4 步中,“ 断言:类型(值)是数字。”然而,该规范没有定义如何处理非数字类型。有人可能会争辩说,在这种情况下应该抛出 TypeError,但我检查的所有实现(Chrome、Safari , Firefox, Node.js) 悄悄地将值转换为零...这就是您所看到的。如果您传递StringDateRegExBoolean,您将获得相同的行为,或undefined

(但是,如果您传递了 BigIntSymbol,您似乎会收到 TypeError……很奇怪。)

【讨论】:

  • 一点也不奇怪,实现确实会在值上调用 toNumber,所以 toNumber( BigIntInstance ) 会抛出,而 toNumber( null ) 会返回 0。顺便说一句,应该注意的是,真实值将因此被转换为1
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 2021-06-03
  • 2019-06-11
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
相关资源
最近更新 更多