我想创建一个不会为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/