Javascript 为什么使用WITH突变会得到不同的结果?

Javascript 为什么使用WITH突变会得到不同的结果?,javascript,immutable.js,Javascript,Immutable.js,我是否误解了它的目的或它的工作原理 var menuItems = Immutable.List.of( { parent_id: 0, id: 1 }, { parent_id: 1, id: 2 }, { parent_id: 1, id: 3 } ); var results1 = menuItems .filter(function(menuItem) { return menuItem.parent_id === 1; }) // Filter out items w

我是否误解了它的目的或它的工作原理

var menuItems = Immutable.List.of(
  { parent_id: 0, id: 1 },
  { parent_id: 1, id: 2 },
  { parent_id: 1, id: 3 }
);

var results1 = menuItems
  .filter(function(menuItem) { return menuItem.parent_id === 1; }) // Filter out items with parent_id = 1
  .sort(function(childA, childB) { return childA.sort_order - childB.sort_order; }); // Sort them by sort_order

var results2 = menuItems.withMutations(function(list) {
  list
    .filter(function(menuItem) { return menuItem.parent_id === 1; }) // Filter out items with parent_id = 1
    .sort(function(childA, childB) { return childA.sort_order - childB.sort_order; }); // Sort them by sort_order
});

console.log(results1.size); // 2
console.log(results2.size); // 3

我的理解是,它们会产生相同的结果,但由于操作链的存在,
带突变
会更快。

您误解了
带突变
。它的目的是为您提供一个临时的游乐场,您可以在这里更改列表,而不是创建副本

例如:

var results2 = menuItems.withMutations(function(list) {
  list.shift()
});
在代码中,使用inside
和mutations
。过滤器会创建一个新数组,并且不会修改原始数组,因此您的
withMutations
不会执行任何操作

我想你最好不要对突变使用
。如果在某个时候您认为“如果我可以修改数组而不是制作副本,这会容易得多”,您可以转到
with mutations

奖励:在将来的版本中,当您尝试执行我所做的操作时,Immutable将抛出一个错误