Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.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_Arrays_Memory Management_Multidimensional Array_Garbage Collection - Fatal编程技术网

Javascript 从阵列中提取子阵列的最安全内存方法

Javascript 从阵列中提取子阵列的最安全内存方法,javascript,arrays,memory-management,multidimensional-array,garbage-collection,Javascript,Arrays,Memory Management,Multidimensional Array,Garbage Collection,我正在迭代一个数组数组,取出我需要的子数组并丢弃其余的 var newArray = []; for (var i = 0; i < oldArray.length; i++) { if (oldArray[i][property] == value) { newArray.push(oldArray[i]); } } oldArray = newArray; var newArray=[]; 对于(var i=0;i

我正在迭代一个数组数组,取出我需要的子数组并丢弃其余的

var newArray = [];
for (var i = 0; i < oldArray.length; i++) {
    if (oldArray[i][property] == value) {
        newArray.push(oldArray[i]);
    }
}
oldArray = newArray;
var newArray=[];
对于(var i=0;i
  • 这是最方便记忆的方法吗

  • 垃圾收集会安全地处理我没有推到的子阵列吗 新阵列

  • newArray是否会分散在内存中,从而阻止此方法有效地扩展

  • javascript原型的特性使一切都成为一个对象。所有的对象都是映射,字面上是散列映射。这意味着,当您将对象从一个数组“拉入”到另一个数组时,您只是在复制它们的引用

    所以,是的,我想说,如果删除引用(至少在现代浏览器中),它不会给您带来太多内存问题。但是垃圾收集器的实现方式不同,具体取决于您使用的浏览器

    1-这是最方便记忆的方法吗

    如果删除引用,是的,这是一种内存友好的方法。你没有像c/c++那样的
    免费
    ,为了在chrome上进行测试,我想你可以调用
    window.gc()
    来调用垃圾收集器。我认为
    delete
    存在,但我不知道它是如何工作的

    2-垃圾收集会安全地处理我没有附加到newArray的子数组吗

    如果没有任何其他引用指向它们。对循环内存泄漏在旧浏览器中很常见,但在新浏览器中可以放心地说是的

    3-newArray是否会分散在内存中以防止此方法有效扩展


    是的,它会分散在内存中,因为javascript数组的工作方式类似于hashmaps或链接hashmaps(如果我错了,请纠正我),但垃圾收集器会处理它,因为它用于处理映射。同样,您只处理对象将保留在同一位置的引用,并且只在数组中存储引用。

    1.不。。。fmsf在很大程度上是正确的,但是您可以对页面加载时间和检查条件的时间进行一些微优化。如果将oldArray.length保留在循环中,它将在每次迭代中查找oldArray对象的长度,这会在大型循环中增加一些时间,如果多次调用包含在其中的方法,同时实例化所有变量也可以节省一些时间。
    当有人下载您的脚本时,最好让所有变量的名称尽可能短,以便从服务器到客户端的数据传输最少

    var nA = [],
        i = 0,
        t = oA.length,
        s;
    for (; i < t; i++) {
        s = oA[i];
        if (s[p] == v) {
            nA.push(s[i]);
        }
    }
    oA = nA;
    
    var nA=[],
    i=0,
    t=oA.长度,
    s
    对于(;i
    如果你真的想认真点,你可以使用一个代码缩略器来重命名变量和删除空白

    2.是的,JavaScript在这些方面做得很好,你唯一需要注意的是IE闭包,它不会由你的代码引起。我仍然发现在IE9中,闭包在罕见的情况下很普遍,但这些闭包通常是由链接到DOM引起的,这在本例中是不相关的


    3.不,这段代码唯一改变的是对对象的引用,而不是它们在内存中的存储方式。

    您必须首先了解,数组根本不存在,它始终是一个map@fmsf我们不知道这一点;问题中没有足够的上下文,“追加”?我想你的意思一定是“.push()”,对吗?@Pointy是的,我们知道数组是一个映射,其索引是映射的key@fmsf是的,我想我会飞到伦敦,除了再次看到它之外,没有其他理由:-)哦,是的,关于地图与阵列的事情,你是对的;我主要是想弄明白他当时说的“附加”是什么意思!当然,他积累东西的外部数组是一个数组,带有“.length”的外部对象可能是一个数组;我不知道内容是数组还是对象。我想他可能是想把选定的行“展平”成一个一维数组。长度提升不应该由V8和Tracemonkey中的循环不变代码运动来处理吗?这不是假设正在使用某些浏览器吗?而且,从技术上讲,即使在优化版本中,边界检查也不会发生,因为所有JavaScript索引都需要进行边界检查,以确定是否扩展数据结构?您的问题有点含糊不清,请编辑您的评论,并将每个对象的名称与我的示例中您在问题中引用它们的项目括起来。在这一点上,我从你的问题中得到的是,你谈论的是边界检查本身,而不是与离开(某个对象)相关联的额外引用查找。与更直接的仅(某个长度)关联相比,长度另一种解释你的评论的方式是,你说的是“nA.push(s[I])”的边界检查,这是对你最初评论的偏离。