为什么这个片段不纯粹?

Why this snippet is not pure?

当我观看 Google Chrome 开发者时, 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)
  )
);

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

  • 在第 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 没变。