功能编程和内存管理

奥古斯丁·里丁格

根据我的理解,函数式编程的特征之一就是我们处理可变对象的方式。

前任:

var notFunctionalFilter = function(objectArray) {
  for (var i=0; i< objectArray.length; i++) {
    if (objectArray[i].active) {
      objectArray.splice(i, 1);
      i --;
    }
  }
  return objectArray;
};

var functionalFilter = function(objectArray) {
  var filtered = [];
  for (var i=0; i< objectArray.length; i++) {
    if (objectArray[i].active) {
      filtered.push(objectArray[i]);
    }
  }
  return filtered;
};

我倾向于以“函数式”的方式编写越来越多的代码,因为它感觉更简洁(尤其是在使用漂亮的LoDash库的JS中,但这不是主题)。

实际上,最近有很多关于该主题的文章,例如非常好的一篇:函数式编程的实用介绍。

但是这里没有讨论过的东西是内存管理。这是我的问题:

  • 我们是否同意functionalFilter使用更多的内存notFunctionalFilter
  • 在决定如何编写filter函数时应考虑到这一点
  • 还是因为垃圾收集器是以功能方式编写,所以垃圾收集器是否能够完美地处理(在大多数语言中)

谢谢

丹尼尔·塞勒斯(Daniel Sellers)

除了一点点,但您的功能过滤器应如下所示:

var functionalFilter = function (item) { return item.active; };

并像这样使用: var filtered = objectArray.filter(functionFilter);

关于“ functionalFilter”的唯一“功能”是它没有副作用。函数式编程和函数式JS不仅限于此。

至于记忆。是的,它使用更多……也许……有点。我假设您要基于名称传递对象数组。使用内置Array.filter函数将最大限度地减少这种情况,但是在您的代码中,额外的内存占用很小。

JS中的对象通过引用传递,这意味着您的新数组仅仅是指向原始对象的指针的数组。(警告:这意味着也要filtered更改它们objectArray。除非进行深度克隆,否则)。数组包装器相对较小,可能甚至不值得在内存方面谈论。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章