首页 > 解决方案 > 为什么这个片段不纯?

问题描述

当我看谷歌浏览器开发者时, https://youtu.be/qaGjS7-qWzg?t=636

他们说这个片段不纯。我不知道为什么。

const g = new Map();

for (const [u,v] of edges) {
    if (!g.has(u))
        g.set(u, []);
    if (!g.has(v))
        g.set(v, []);
    g.get(u).push(v)
}

他们还提到这是纯粹的,

const startPoints = new Set(edges.map(([u, v]) => u));

const g = new Map(
  [...startPoints].map(startPoint =>
    edges.filter(([u, v]) => u == startPoint).map(([u, v]) => v)
  )
);

标签: javascriptpurely-functional

解决方案


当我们谈论系统中的纯度时,我们谈论的是不会改变可观察状态的系统。

  • 在第 1 行的第一个脚本中g是空Map的,到最后一行则不是。它的价值发生了变异。
  • 在第二个脚本startPoints中,第一行和最后的内容相同。

为了简单一点,让我用一个函数来解释一下。假设你有一个函数,它给出一个数字数组,它将它乘以 2。所以如果:

var a = [1,2,3];
multiply(a)
// a = [2, 4, 6]

这个函数不是纯粹的。在这种情况下,它改变了系统的可观察状态a。但如果:

var a = [1,2,3];
var b = multiply(a)
// a = [1, 2, 3]
// b = [2, 4, 6]

这个函数是纯的。a没有改变。


推荐阅读