Javascript-concat()的作用类似于push()
我有多个字节数组,每个数组的长度为10000000(10MB)。我将它们存储在这个对象中Javascript-concat()的作用类似于push(),javascript,node.js,electron,Javascript,Node.js,Electron,我有多个字节数组,每个数组的长度为10000000(10MB)。我将它们存储在这个对象中 class object{ var buffer = new Array(); updateBuffer(buffer){ this.buffer = this.buffer.concat(buffer); } } 每次收到新的字节数组时(大约15次),我都会调用该方法。我希望object.buffer.length的结果是~150MB,但输出是15。如果我尝试这样
class object{
var buffer = new Array();
updateBuffer(buffer){
this.buffer = this.buffer.concat(buffer);
}
}
每次收到新的字节数组时(大约15次),我都会调用该方法。我希望
object.buffer.length
的结果是~150MB,但输出是15。如果我尝试这样做object.buffer[0]。lenght
输出是10MB,因此concat()
充当push()
。你知道为什么吗?我想你每次收到一个新包时都会创建一个对象的实例!因此,每次都会创建一个新对象,从而创建一个新的缓冲区数组
您必须在计时器(接收器)块外部创建对象的实例
,并在收到每个包后使用它
同样,使用console(console.log(buffer)
)或其他方式检查buffer
参数。这可能类似于[[byte1,b2,b3]]
而不是[byte1,b2,b3]
,这会导致长度=15。我认为您应该验证那些缓冲区
对象的外观是否与您认为的一样。如果每个数组都是嵌套在另一个数组中的数组,那么您所描述的就有意义了。您提供的代码不是有效的javascript@是的,你是对的,这会更有意义,但它们实际上是数组。只需使用buffer.length
(10MB)进行验证@Olian04是的,你只是没有为这个对象创建一个实例,它实际上创建了一个矩阵,正如我说的,它的行为就像一个数组。这不是多个实例的问题,因为即使收到第一个包,也会发生此问题。矩阵如下所示:[[10MB],[10MB],[10MB]
,而我应该有一个类似于:[150MB]
的数组。我的答案的第二部分描述了这个问题。如果buffer
参数类似于[[b1,b2,…]]
,那么结果将是:[[…],…],…],…]
,因此长度将等于15(类似于推送
)。在这种情况下,您可以这样更改代码:this.buffer=this.buffer.concat.apply(this.buffer,buffer)