Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.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,我有一个数组声明为 var arr = new Array(); 然后我有一个由服务器返回的对象数组。该数组中的每个对象都有三个字段(始终)。我必须循环执行此操作,并有条件地将其添加到arr数组中 由于此arr不是预先分配的,因此它会影响主阵列中大量数据的性能 在获得主响应数组后,是否有任何方法可以预分配arr数组,以避免出现此性能问题 还有,如何获得对象的大小 谢谢。假设您有10个对象,并且要将每个对象的三个值传递给一个数组。通过将整数30传递给数组构造函数,可以初始化长度为30(10*3)

我有一个数组声明为

var arr = new Array();
然后我有一个由服务器返回的对象数组。该数组中的每个对象都有三个字段(始终)。我必须循环执行此操作,并有条件地将其添加到arr数组中

由于此arr不是预先分配的,因此它会影响主阵列中大量数据的性能

在获得主响应数组后,是否有任何方法可以预分配arr数组,以避免出现此性能问题

还有,如何获得对象的大小


谢谢。

假设您有10个对象,并且要将每个对象的三个值传递给一个数组。通过将整数30传递给数组构造函数,可以初始化长度为30(10*3)的数组,如下所示:

var numObjects = 10;
var myArray = new Array(3*numObjects);
请参考我的jsperf基准,以获得性能的证明。简言之,预调整阵列大小在Firefox 38中快了约25%,在Chrome 42中快了约81%,在Internet Explorer 11中快了约16%。数字将因运行这些基准的个人经验而异,但趋势将保持一致。通过预先调整阵列的大小可以获得最佳性能。

关于这个话题的更深入的讨论已经在这里进行了

感谢您所相信的(或不相信的)Javascript无法直接访问内存分配的上帝。考虑到互联网上乱扔的JS的质量,这真是太可怕了

Javascript将在创建时自行为数组分配内存,并在对内存进行垃圾收集时回收内存。预填充阵列不会对内存使用或性能产生积极影响

编辑:我错了。见@ThisClark的答案


MDN在javascript中有很好的表现。

您可以使用
过滤器
函数过滤数组,如下面的示例所示

var result = [
    {
        age: 15
    },
    {
        age: 21
    },
    {
        age: 25
    }
];

function isGreaterThan20(obj) {
  return obj.age > 20;
}

var arr = result.filter(isGreaterThan20);
// arr becomes [{ age: 21}, { age: 25}]

如果您需要预先分配一个具有定义大小的数组,请使用
newarray(size)

不要担心它,说真的,这不是C语言,高级语言的要点是不必担心这些东西。对于循环问题,只需对返回的数组调用
Array#filter
。@TasosK。你能用一个基准来证明这有什么积极的影响吗?@papirtiger是的,的确如此。@ThisClark,所以如果我有10个对象,每个对象有三个值(键),那么数组长度将是30?我的意思是,如果Key-in对象的值是一个字符串,该怎么办?@aneeshere您想在数组中确切地输入什么?关键和价值是两个不同的东西。考虑<代码> var Obj= { a:1 };
键为
a
,值为
1
。您可以将三个
obj
放在一个数组中,也可以只将
a
放在一个数组中,也可以只将
1
放在一个数组中。你想在数组中放入什么?@aneesh你会说
var数组=新数组(100)对象通过引用推送到数组上,因此通过分配大小为100的数组,您可以为100个引用留出空间。这意味着该对象没有复制到数组中,因此您无需为每个对象的属性留出额外的空间。我认为您和许多其他人可能会忽略的一点是,正如您所说,Javascript并不是“直接访问内存分配”的,而是web浏览器实现了它的语言版本,它可以访问内存分配。另外,在您提供的链接中,没有任何迹象表明Javascript在处理内存管理方面与其他语言不同。我从这篇文章中学到的一点是,不管是哪种编程语言,内存生命周期几乎都是一样的。
感谢您分享您的知识,我在这里学到了一些新东西。我对数组预分配的看法是错误的,并与自己争论是否应该删除我的答案。我认为更好的说法是,浏览器不提供对内存分配的直接访问——这不是一种遗漏,而是一种有意识的设计选择。想到所有jQuery忍者都会从浏览器中破解出一个
malloc
,我仍然不寒而栗。