Javascript Immutable.js比较是如何工作的?
我已经使用Immutable.js有一段时间了,刚才我发现比较运算符并不像我想的那样工作 我的代码很简单:Javascript Immutable.js比较是如何工作的?,javascript,functional-programming,immutability,immutable.js,Javascript,Functional Programming,Immutability,Immutable.js,我已经使用Immutable.js有一段时间了,刚才我发现比较运算符并不像我想的那样工作 我的代码很简单: a = Immutable.Map({a:1, b:[1,2,3]}) b = Immutable.Map({a:1, b:[1,2,3]}) a == b // false Immutable.is(a, b) // false 有没有办法比较两个相同的不可变对象并得到true 函数逻辑告诉我它们应该相等,但在JavaScript中它们不相等。a==b本质上比较两个对象的“地址”。 在
a = Immutable.Map({a:1, b:[1,2,3]})
b = Immutable.Map({a:1, b:[1,2,3]})
a == b // false
Immutable.is(a, b) // false
有没有办法比较两个相同的不可变对象并得到true
函数逻辑告诉我它们应该相等,但在JavaScript中它们不相等。a==b本质上比较两个对象的“地址”。 在代码中,您创建了两个不同的对象实例,因此它们总是不同的,因此根据JavaScript规范,
a==b
为false
至于如何比较JS中的两个对象,请检查以下内容:
如果如上所示保留对内部数组的引用(如c
),则创建a
和b
的方式将允许产生副作用
我认为这些比较正确地告诉你,这些对象是不同的。我的猜测是
[1,2,3]!=[1,2,3]
在b
键中。试着把同一个对象放在两个列表中,或者让它成为两个不可变的列表(或者不管他们怎么称呼它)不知道不可变的是如何工作的,但是要进行对象比较,你需要构建深度比较功能,你是对的!如果我使用Immutable.fromJS
而不是Immutable.Map
comparison就可以了。对于经常发生变化的深层结构来说,将所有对象都保持在不可变的状态,并且不要忘记一些普通的映射或数组是不切实际的。assert(a!=b)
是预期的,那么不可变呢。
是吗?@Pavlo如果不可变。is(a,b)
真的是假的,那么这可能是它们实现中的一个bug。Immutable.is的定义在他们的文档中有点模糊。
(function () {
var c = [1,2,3],
a = Immutable.Map({a:1, b: c}),
b = Immutable.Map({a:1, b:[1,2,3]});
c[0] = 9;
console.log(JSON.stringify(a), JSON.stringify(b));
}());