函数式编程和内存管理

Functional programming and memory management

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

例如:

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;
};

我倾向于用 "functionnal way" 编写越来越多的代码,因为它感觉更干净(尤其是在 JS 中使用漂亮的 LoDash 库,但这不是主题)。

最近确实有很多关于这个主题的文章,比如这篇非常好的文章:A practical introduction to functional programming

但是那里从来没有讨论过内存管理。这是我的问题:

谢谢

这是一个小问题,但您的功能过滤器应该如下所示:

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

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

关于您的 "functionalFilter" 的唯一 "functional" 是它没有副作用。函数式编程和函数式 JS 远不止于此。

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

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