函数式编程和内存管理
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
但是那里从来没有讨论过内存管理。这是我的问题:
- 我们同意
functionalFilter
使用的内存比 notFunctionalFilter
多吗?
- 在决定如何编写
filter
函数时是否应考虑到这一点?
- 或者垃圾收集器是否完美地处理了这个问题(在大多数语言中),因为它是以函数式方式编写的?
谢谢
这是一个小问题,但您的功能过滤器应该如下所示:
var functionalFilter = function (item) {
return item.active;
};
并像这样使用:
var filtered = objectArray.filter(functionFilter);
关于您的 "functionalFilter" 的唯一 "functional" 是它没有副作用。函数式编程和函数式 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;
};
我倾向于用 "functionnal way" 编写越来越多的代码,因为它感觉更干净(尤其是在 JS 中使用漂亮的 LoDash 库,但这不是主题)。
最近确实有很多关于这个主题的文章,比如这篇非常好的文章:A practical introduction to functional programming
但是那里从来没有讨论过内存管理。这是我的问题:
- 我们同意
functionalFilter
使用的内存比notFunctionalFilter
多吗? - 在决定如何编写
filter
函数时是否应考虑到这一点? - 或者垃圾收集器是否完美地处理了这个问题(在大多数语言中),因为它是以函数式方式编写的?
谢谢
这是一个小问题,但您的功能过滤器应该如下所示:
var functionalFilter = function (item) {
return item.active;
};
并像这样使用:
var filtered = objectArray.filter(functionFilter);
关于您的 "functionalFilter" 的唯一 "functional" 是它没有副作用。函数式编程和函数式 JS 远不止于此。
至于内存。是的,它使用更多……也许……有点。我假设您要根据名称传入一个对象数组。使用内置 Array.filter
将最大限度地减少这种情况,但在您的代码中,额外的内存占用很小。
JS中的对象是通过引用传递的,这意味着你的新数组只是一个指向原始对象的指针数组。 (警告:这意味着在 filtered
中更改它们也会在 objectArray
中更改它们。除非您进行深度克隆)该数组包装器相对较小,甚至可能不值得在内存方面讨论。