新的ES 6(和谐)引入了新的Set对象。Set使用的身份算法类似于===运算符,因此不太适合比较对象:
===
var set = new Set(); set.add({a:1}); set.add({a:1}); console.log([...set.values()]); // Array [ Object, Object ]
如何自定义Set对象的相等性以进行深层对象比较?有没有像Java一样的东西equals(Object)?
equals(Object)
ES6 Set对象没有任何比较方法或自定义比较可扩展性。
Set
的.has(),.add()而.delete()方法只关闭它是一个基本相同的实际物体或相同的值,没有办法插头插入或更换只是逻辑。
.has()
.add()
.delete()
你大概可以从派生您自己的对象Set和替换.has(),.add()并.delete()与一些做了深刻的对象比较方法,先找到,如果该项目已经在设置,但性能可能不会很好,因为底层Set对象不会帮助完全没有 在调用原始对象之前,您可能需要对所有现有对象进行蛮力迭代才能找到匹配项.add()。
5.2为什么我不能配置映射和设置比较键和值的方式?
问题:如果有一种方法可以配置哪些映射键和哪些设置元素被认为是相等的,那就太好了。为什么不在那里?
答:由于难以正确有效地实施,该功能已被推迟。一种选择是将回调传递给指定相等性的集合。
Java中可用的另一个选项是通过对象实现的方法(Java中的equals())指定相等性。但是,这种方法对于可变对象是有问题的:通常,如果对象发生更改,则其在集合中的“位置”也必须更改。但这不是Java中发生的情况。JavaScript可能会走上一条更安全的路线,即仅对特殊的不可变对象(所谓的值对象)启用按值比较。按值比较意味着,如果两个值的内容相等,则认为这两个值相等。在JavaScript中按值比较原始值。