所有空的Immutable.Lists都是相同的

时间:2016-06-28 15:16:03

标签: immutable.js

功能或错误:所有空的Immutable.Lists测试为相同。

例如:

var xxx = new Immutable.List();
var yyy = new Immutable.List();
xxx === yyy;   // true

var zzz = yyy.push(1).pop();
zzz === yyy;    // true

zzz = Immutable.fromJS([]);
xxx === zzz;    // true

我可以看到为什么你可能想要将所有空列表视为相同,但我也有用例,因为2个列表为空并不意味着它们是相同的。作为一个反例,如果我创建两个具有相同内容的Immutable.Lists,它们不会测试相同。

有没有办法分开2个空列表?

你认为这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

我不是Immutable.js的专家,也不是贡献者,但我会尝试在不可变数据结构中写下一些想法。

Immutable.js针对性能进行了优化。特别是进行平等检查。不可变背后的想法是,如果我们有不可变的数据结构,我们可以通过比较引用来确定结构是否发生了变化。 Immutable.is实现的第一件事是检查引用是否相等:

export function is(valueA, valueB) {
  if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {
    return true;
  }
  // ...
}

如果它们是相同的,我们总是可以假设结构仍然是相同的,因为它是不可变的。使所有空列表相等可以提高性能。

我们还需要理解的是,不可变数据结构广泛用于函数式编程语言(Immutable.js is actually inspired by Scala and Closure)。函数式编程语言比其他语言更接近数学。数学是以价值为基础的,这意味着在数学中没有实例。我们假设包含元素1,2和3的集合等于1,2和3的集合。空集合总是等于空集合。空列表等于空列表。

Scala REPL的一些有趣结果:

scala> List(1, 2, 3) == List(1, 2, 3)
res0: Boolean = true

scala> Nil == Nil
res1: Boolean = true

scala> 1 :: 2 :: 3 :: Nil == List(1, 2, 3)
res2: Boolean = true