我可以在ES6中创建集合:
let s = new Set([1, 2, 3]);
let q = new Set([3, 1, 2]);
但无法通过它们所包含的内容进行比较。
console.log(s == q); // --> false
API中没有提供. equals(其他)
方法,只有. has()
,delet()
等。
(我不是在寻找解决办法,比如这个答案中提供的那些。我只是想知道为什么会做出这个决定,因为肯定有一些关于它周围环境的事情我不理解。)
非原语(即对象)的等效性比较它们是否是字面上相同的实际对象。这不是一个新概念。JS中的其他非原始内容也是如此:
var a = [1,2,3];
var b = [1,2,3];
console.log(a == b); // -> false
var c = {foo:'bar'};
var d = {foo:'bar'};
console.log(c == d); // -> false
简单:因为两个原语是否“相同”的概念与两个对象是否“相同”的概念不同。
实际上,您可以对同一对象进行多个引用,因此检查两个引用是否“相同”的含义与原语非常不同。它们实际上可能是指向同一对象的实际指针:
var str1 = 'foo';
var str2 = str1;
str2 += ' bar';
console.log(str2); // -> "foo bar"
console.log(str1); // -> still just "foo"
// str1 is unchanged, primitives don't do pointers
var obj1 = {val:'foo'};
var obj2 = obj1;
obj2.val += ' bar';
console.log(obj2.val); // -> "foo bar"
console.log(obj1.val); // -> "foo bar"
// obj1 and obj2 are LITERALLY pointers to the same thing
// changing one changes the other
因此,对于基本体(其存在的一个完整点是,这些值足够基本,我们可以对它们进行比较,即使它们实际上在内部没有指向相同的实际1和0),当我们会问这样一个问题:“它们是等价的吗?”?
基元之所以被称为基元,是因为它们是简单/基元值。正因为如此,它们很容易比较。
物体在设计上要复杂得多。它们甚至可以保存对其他对象的引用。。。甚至对他们自己。按照你暗示的方式进行比较可能是一个无限的迭代过程,而不是一个简单的操作。考虑一下:
var a = {foo:'bar'};
a.a = a;
console.log(a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.foo); // -> bar
// could go on forever that way
让类似于检查等价性的东西突然意味着可能是无限的迭代过程将对语言产生深远的负面影响。更有意义的是,它们只是检查它们是否真的相等(即指向同一个精确的对象)。
问题内容: SSCCE: 以上输出: 问题答案: 异常类继承自其方法,并且不会覆盖它。每次都创建新的Exception实例,它们是内存中的不同对象。即使它们的堆栈跟踪相同,但它们在内存中的对象分配仍然不同,并且使用默认的equals()方法,它们并不相同。 但是,您可以定义自定义异常类并重写。
问题内容: 我有上述2个类(POJO),它们都是绝对相同的(除了课程名称),我将它们添加到两个数组列表:aListA和aListB。我需要比较两个对象是否相同。如果它们相同,则需要将它们添加到另一个列表(commonList)中,如果它们恰好是不同的,则需要将它们添加到另一个列表(differentList)中。我写了以下代码: 我的问题是,即使两个不同POJO中的数据(变量,firstId和se
本文向大家介绍JavaScript比较两个对象是否相等的方法,包括了JavaScript比较两个对象是否相等的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript比较两个对象是否相等的方法。分享给大家供大家参考。具体如下: 在Python中可以通过cmp()内建函数来比较两个对象所包涵的数据是否相等(数组、序列、字典)。但是在javascript语言中并没有相关的实现。
如何比较两个javascript集?我尝试使用和但都返回false。 这两个集合是等价的,因为根据定义,集合没有顺序(至少通常没有)。我看了MDN上的集合的留档,没有发现任何有用的东西。有人知道怎么做吗?
我创建了的两个实例,如下所示。一个是从创建的,另一个是相同的,但在开头加上了一些附加的数字。使用方法比较它们时,它返回: 我认为添加的数字被丢弃了,并且两者给出了相同的UUID字符串值。为什么会这样?
问题内容: 所述Collection.contains()方法检查如果一个集合包含一个给定的对象,使用该方法来执行比较。 从Java7 Javadoc: 布尔contains(Object o) 如果此集合包含指定的元素,则返回true。更正式地说,当且仅当此集合包含至少一个元素(e == null?e == null:o.equals(e))时,返回true。 有没有一种聪明的方法来检查集合是否