Javascript:创建一个深度克隆/扩展/复制功能,不会为 GC 产生任何垃圾

标签 javascript object garbage-collection clone real-time

我想创建一个不会为GC产生任何垃圾的extendDeep()函数。

垃圾收集器需要尽可能不活动。 引用号:https://www.scirra.com/blog/76/how-to-write-low-garbage-real-time-javascript

这是我要修改的extendDeep()函数:

function extendDeep(parent, child) {
    var i, toStr = Object.prototype.toString,
        astr = "[object Array]";

    child = child || {};

    for (i in parent) {
        if (parent.hasOwnProperty(i)) {
            if (typeof parent[i] === 'object') {
                child[i] = (toStr.call(parent[i]) === astr) ? [] : {};
                extendDeep(parent[i], child[i]);
            } else {
                child[i] = parent[i];
            }
        }
    }
    return child;
}

该函数不必返回任何内容。因为重新调整的对象就是产生垃圾的原因。

假设父对象的所有属性都可以通过引用获得(对象的重用)

最佳答案

JS 解释器在执行 toStr.call(parent[i]) 时可能会避免创建字符串,但如果您不能依赖它们进行优化,那么您可以避免在非常中创建字符串。常见情况通过改变

toStr.call(parent[i]) === astr

parent[i] instanceof Array  // Is a regular array.
|| (!(parent[i] instanceof Object)  // Is cross-frame
    && 'number' === typeof parent[i].length  // Might be an array
    && toStr.call(parent[i]) === astr)  // So check the hidden [[Class]] property.

如果您知道您正在处理由同一框架的构造函数创建的对象(因此没有跨框架对象共享),那么您只需这样做

parent[i] instanceof Array

关于Javascript:创建一个深度克隆/扩展/复制功能,不会为 GC 产生任何垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13637636/

相关文章:

java - 我们可以在 JDK 8 中根据特定时间轮换 GC 日志吗?

javascript - jQuery - 通过单个请求提交多个表单,无需 Ajax

javascript - 在箭头函数中返回扩展数组

javascript - AngularJS 本地/全局范围变量的使用

javascript - 如何将来自 setInterval 的数据推送到数组中

python - 实现在属性更新时调用外部函数的 Python 类的正确方法

java - 如何在 Eclipse 中使用 GCMV?

javascript - 鼠标悬停时更改图像的通用函数

JavaScript 对象数组

c# - 有趣的 OutOfMemoryException 与 StringBuilder