Javascript 我在网上找到了函数式编程的代码。如果数组正在更改,并且我们正在使用循环,那么是否将其视为函数式编程?

Javascript 我在网上找到了函数式编程的代码。如果数组正在更改,并且我们正在使用循环,那么是否将其视为函数式编程?,javascript,functional-programming,Javascript,Functional Programming,我在这里找到了这段代码只需阅读代码前面的2-3段文字: 这一次,我们不会让事情发生变异: var things = [1, 2, 3, 4]; var newThings = map(v => v * 10, things); var newThings=[]; for(var i=0;i

我在这里找到了这段代码

只需阅读代码前面的2-3段文字:

这一次,我们不会让事情发生变异:

var things = [1, 2, 3, 4];
var newThings = map(v => v * 10, things);
var newThings=[];
for(var i=0;i
好吧,所以我们没有变异东西,但技术上我们变异了新东西。 现在,我们将忽略这一点。毕竟,我们使用的是Javascript。 一旦我们转向函数式语言,我们将无法变异

这里的重点是理解这些函数如何工作并帮助我们 减少代码中的噪音

因此,作者知道你的观点,但“…将忽略这一点。”

问题是作者正在定义一个
map
函数,当时JavaScript(2016)已经引入了
map
方法(和
filter
reduce
Array.from
,…)。但是想象这种函数不可用,在JavaScript中除了将值推送到数组中,或者用
newArray[i]=
注入值之外,您没有什么其他方法可以做

作者的目的是创造一个可以被批评的功能,他说:

……但至少我们不必再编写样板代码了

现在作者有了一些(
map
)可以以真正实用的方式使用


为什么作者没有在JavaScript中使用任何允许从一开始就进行函数式编程的可用策略?他们可能想让读者慢慢地从命令式编程过渡到函数式编程,而不是立即跳转到从一开始就具有功能的本机方法和语法。我们只能猜测。

只需阅读代码前面的2-3段文字:

这一次,我们不会让事情发生变异:

var things = [1, 2, 3, 4];
var newThings = map(v => v * 10, things);
var newThings=[];
for(var i=0;i
好吧,所以我们没有变异东西,但技术上我们变异了新东西。 现在,我们将忽略这一点。毕竟,我们使用的是Javascript。 一旦我们转向函数式语言,我们将无法变异

这里的重点是理解这些函数如何工作并帮助我们 减少代码中的噪音

因此,作者知道你的观点,但“…将忽略这一点。”

问题是作者正在定义一个
map
函数,当时JavaScript(2016)已经引入了
map
方法(和
filter
reduce
Array.from
,…)。但是想象这种函数不可用,在JavaScript中除了将值推送到数组中,或者用
newArray[i]=
注入值之外,您没有什么其他方法可以做

作者的目的是创造一个可以被批评的功能,他说:

……但至少我们不必再编写样板代码了

现在作者有了一些(
map
)可以以真正实用的方式使用


为什么作者没有在JavaScript中使用任何允许从一开始就进行函数式编程的可用策略?他们可能想让读者慢慢地从命令式编程过渡到函数式编程,而不是立即跳转到从一开始就具有功能的本机方法和语法。我们只能猜测。

是的,代码违反了不变性的功能原则。
这到底有多糟糕取决于你的观点——从实用主义的角度讲,这并没有太大的区别,因为它使你能够以一种功能性的方式使用地图

这是一种使用递归函数定义
map
而不违反不变性的方法:

var newThings = [];
for (var i = 0; i < things.length; ++i) {
    newThings[i] = things[i] * 10;
}
console.log(newThings); // [10, 20, 30, 40] 
这是一个考虑尾部递归的实现:

const map = (f, array) => {
  if(!array.length) {
    return [];
  }
  const [head, ...tail] = array;
  const mappedHead = f(head);
  if(!tail.length) {
    return [mappedHead];
  }
  return [mappedHead, ...map(f, tail)];
}

是的,该代码违反了不变性的功能原则。
这到底有多糟糕取决于你的观点——从实用主义的角度讲,这并没有太大的区别,因为它使你能够以一种功能性的方式使用地图

这是一种使用递归函数定义
map
而不违反不变性的方法:

var newThings = [];
for (var i = 0; i < things.length; ++i) {
    newThings[i] = things[i] * 10;
}
console.log(newThings); // [10, 20, 30, 40] 
这是一个考虑尾部递归的实现:

const map = (f, array) => {
  if(!array.length) {
    return [];
  }
  const [head, ...tail] = array;
  const mappedHead = f(head);
  if(!tail.length) {
    return [mappedHead];
  }
  return [mappedHead, ...map(f, tail)];
}