功能或错误:所有空的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个空列表?
你认为这是一个错误吗?
答案 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