Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Immutable.js比较是如何工作的?_Javascript_Functional Programming_Immutability_Immutable.js - Fatal编程技术网

Javascript 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本质上比较两个对象的“地址”。 在

我已经使用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本质上比较两个对象的“地址”。 在代码中,您创建了两个不同的对象实例,因此它们总是不同的,因此根据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));
}());