Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么缓冲区上的Javascript视图都是零?_Javascript - Fatal编程技术网

为什么缓冲区上的Javascript视图都是零?

为什么缓冲区上的Javascript视图都是零?,javascript,Javascript,我创建了一个缓冲区,然后在其上创建了一个Uint8Array,但该数组没有任何值。我希望它具有缓冲区的值。这是一个易于复制的示例: var buf=newarraybuffer(32); 对于(var指数=0;指数

我创建了一个缓冲区,然后在其上创建了一个Uint8Array,但该数组没有任何值。我希望它具有缓冲区的值。这是一个易于复制的示例:

var buf=newarraybuffer(32);
对于(var指数=0;指数<32;指数++)buf[index]=index;
控制台日志(buf);
var arr=新的UINT8阵列(buf);
控制台日志(arr)An只是一个表示内存片的对象。它有固定的尺寸,就是这样。它没有表示内容的属性,因此需要一个类型化数组作为缓冲区上的视图。您的代码只是将属性分配给缓冲区,缓冲区作为对象工作,但实际上并不操纵保持为零的字节内容

如果不需要缓冲区,则根本不显式实例化它。只要写

var arr = new Uint8Array(32);
for (var index = 0; index < 32; index++) arr[index] = index;
console.log(arr.buffer); 
console.log(arr);

为什么要使用缓冲区而不是简单的普通字符串呢?在第一个示例中,当您
console.log(arr.buffer)时
,您会注意到,
Uint8Array
实际上记录了
ArrayBuffer
。我认为这就像Bergi所说的,它只是一片内存,Uint8Array无法直接访问其内容。我想知道为什么在mdn文档中,如果没有复制值,他们允许使用ArrayBuffer构造Uint8Array。没什么意义。@kemicofa那正是我的问题。我知道我可以解决这个问题,例如从缓冲区读取每个字节并填充我的视图,但我也必须关注endianness,我认为这有点违背了使用类型化数组的目的。因此,如果有一种从缓冲区自动填充Uint视图的解决方案,那么如果想要进行微优化,那么使用类型化数组是有意义的。如果不是,那么我根本不明白为什么我们要键入数组。@kemicofa所说的“自动”当然是指语言级别,而不是为它编写算法。我同意你的说法,但是,为什么上的mdn文档显示,如果内容没有被复制,它可以接受
ArrayBuffer
?实际上,如果我在创建视图后分配数据,它会工作,但是如果您查看问题中的其他示例,我之前不知道日期格式,您可以看到我编写的一个实际示例,在该示例中,在缓冲区填充了数据之后,能够定义一个视图会更好。@kemicofa它可以接受一个现有的缓冲区,在该缓冲区上它将成为一个视图。(我不知道你说的“抄袭”是什么意思)。但是它也可以创建缓冲区本身,这通常更简单。@LajosArpad填充缓冲区后,您可以定义其他视图,没有问题。关键是,对于初始填充,您还需要使用视图。
const arr = Uint8Array.of(2,0,1,9,0,3,0,1,1,3,0,3,5,0);
// or       Uint8Array.from([2,0,1,9,0,3,0,1,1,3,0,3,5,0])
// or       new Uint8Array(2,0,1,9,0,3,0,1,1,3,0,3,5,0]);
const buf = arr.buffer;