【问题标题】:Why this snippet is not pure?为什么这个片段不纯?
【发布时间】:2020-02-08 15:24:11
【问题描述】:

当我观看 Google Chrome Developers 时, https://youtu.be/qaGjS7-qWzg?t=636

他们说这个sn-p不纯。我不知道为什么。

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)
  )
);

【问题讨论】:

    标签: javascript purely-functional


    【解决方案1】:

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

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

    【讨论】:

    • 所以你不能在纯世界中使用pop、push之类的东西吗?似乎当您每次都想改变一个对象/数组时,您必须分配一个新变量。
    • 在纯粹的世界中(JavaScript 不是),每次你想改变状态时都会创建新的副本。在 JS 中有一个库可以做到这一点immutable-js.github.io/immutable-js.
    猜你喜欢
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多