Memory management 函数式编程和内存管理

Memory management 函数式编程和内存管理,memory-management,functional-programming,mutable,Memory Management,Functional Programming,Mutable,根据我的理解,函数式编程的一个特点是我们处理可变对象的方式 例: var notFunctionalFilter=function(objectArray){ 对于(var i=0;i

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

例:

var notFunctionalFilter=function(objectArray){
对于(var i=0;i
我倾向于用“Functional方式”编写越来越多的代码,因为它感觉更干净(特别是在使用漂亮库的JS中,但这不是主题)

事实上,最近有很多关于这个话题的文章,比如这篇非常好的文章:

但是有一件事在那里从未被讨论过,那就是内存管理。以下是我的问题:

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

谢谢

这是一个轻微的旁白,但您的功能过滤器应如下所示:


var functionalFilter=功能(项目){
返回项目.active;
};

使用方法如下:

var filtered=objectArray.filter(functionFilter);

你的“功能过滤器”唯一的“功能”是它没有副作用。函数式编程和函数式JS远不止这些

至于记忆。是的,它使用更多。。。大概某种程度上。我假设您正在传递一个基于名称的对象数组。使用内置的
Array.filter
可以最大限度地减少这种情况,但在代码中额外的内存占用很小

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

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