javascript:循环内部阻止作用域,性能差异



我有以下代码片段,

poupulateData(data) {
//lets assume variable data is an array of objects with more 400 data
let arr = [];
let obj;
if (data && data.length) {
for (let i = 0; i < data.length; i++) {
obj=  data[i];
arr.push(obj.features);        
}
}
}

我已经在循环外声明了变量obj,在下面的代码片段中,我将在循环内声明obj,比如这个

poupulateData(data) {
//lets assume variable data is an array of objects with more 400 data
let arr = [];       
if (data && data.length) {
for (let i = 0; i < data.length; i++) {
let obj=  data[i];
arr.push(obj.features);        
}
}
}

变量obj的内存分配将在循环结束后释放,所以我想知道如果集合是大,在内存分配和性能方面哪个最好

循环中声明的变量将在每个循环中声明,从而分配额外的内存。此外,变量在循环后不会立即清理。您可以通过设置obj = null来告诉垃圾收集器在每个周期后运行,这将减少内存占用,但会花费一些CPU时间。还要记住,您不能直接控制垃圾收集器。JavaScript引擎在运行代码之前会对其进行优化,如果系统中有足够的可用内存,那么它很可能会在CPU不忙时释放内存。

一般来说,在循环外声明变量并在循环结束后对其进行清理对性能更好。这里有一个例子:

poupulateData(data) {
let arr = new Array(data.length); // set the size to save some memory
let obj = {}; //set it to object to avoid casting it when the loop starts
if (data && data.length) {
for (let i = 0; i < data.length; i++) {
obj = data[i];
arr[i] = obj.features;        
}
}
obj = null //clean some memory
i = null
}

通常您不需要关心JavaScript中的这些内容。在执行代码之前,已经完成了相当不错的优化。

如果您追求性能,通常在处理数组时,建议使用所提供的数组方法,因为它们经过优化以处理数组。

最新更新