Javascript 在Array.prototype.reduce中使用不纯还原剂安全吗?

Javascript 在Array.prototype.reduce中使用不纯还原剂安全吗?,javascript,functional-programming,Javascript,Functional Programming,我想知道在javascript中的array.prototype.reduce中使用不纯净的减缩器是否安全 例如: 假设我有以下数组: [{ id: 0, value: 6 }, { id: 1, value: 25 }] 如果我想将其转换为一个映射,其中ID成为键,值成为值 我有两个选择:一个是纯还原剂,一个是不纯还原剂 // pure option const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }]; const object

我想知道在javascript中的
array.prototype.reduce
中使用不纯净的减缩器是否安全

例如:

假设我有以下数组:

[{ id: 0, value: 6 }, { id: 1, value: 25 }]
如果我想将其转换为一个映射,其中ID成为键,值成为值

我有两个选择:一个是纯还原剂,一个是不纯还原剂

// pure option
const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }];
const object = data.reduce((accum, { id, value }) =>
  Object.assign({}, accum, { [id]: value }), 
  {}
);
const map = new Map(Object.entries(object));
// impure option
const data = [{ id: 0, value: 6 }, { id: 1, value: 25 }];
const map = data.reduce(
  (accum, { id, value }) => accum.set(id, value),
  new Map()
);

虽然“不纯”选项速度快得多,样板代码也少,但我不确定它是否安全,或者它是否能提供比赛条件。

你考虑得太多了

没关系,我们中的很多人(包括我自己)都会去那里。但是问问你自己这个问题:从使用你地图的实体的角度来看,你能分辨出区别吗?答:不。事实上,一个足够聪明的编译器会把前者变成后者。虽然我通常在编写代码时尽量避免成为人工编译器,但在这种情况下,不纯净的版本会更短、更清晰、更快

Javascript中的本地状态很好


这并不是说任何事情都会发生,我不会在reducer(或任何其他函数中)中变异外部数据结构,而是变异一个不会在reduce调用之外“泄漏”的数据结构,并且仅为了以这种方式构造而实例化的数据结构是可以的。

Javascript是单线程的;在同步代码中,不会有竞争条件。旁注:您运行过示例吗?第一个选项似乎不起作用,因为
assign
的目标对象已丢失第三个选项:
newmap(data.Map({id,value})=>([id,value]))
不使用局部效果意味着在没有获得纯函数式语言提供的保证的情况下限制自己