检查集合是否包含Javascript中的列表

Shi*_*aul 6 javascript set ecmascript-6

我有一套我已经添加了一个列表.

var a = new Set();
a.add([1]);
Run Code Online (Sandbox Code Playgroud)

现在我检查是否[1]存在于a:

a.has([1]);
> false
Run Code Online (Sandbox Code Playgroud)

根据规范,这可能会发生,因为如果要比较的两个对象的类型相同:

如果x和y引用同一个对象,则返回true.否则,返回false.

这也发生了:

[1] == [1]; 
> false
Run Code Online (Sandbox Code Playgroud)

因此,它可能是设置.has()==比较平等的(不知道虽然)..contains()JS中的Set()有像Java一样的方法吗?

Jos*_*eam 14

您无法比较数组和对象之类的引用是否相等(但您可以比较值).

你正在这样做,你正在检查不同的引用,即使值看起来是相同的.

做这样的事情:

var a = new Set();
var b = [1];

a.add(b);

a.has(b); // => true
Run Code Online (Sandbox Code Playgroud)

看看MDN的Equality比较和相同性.

所以可能是Set .has()使用==来比较相等(虽然不确定)

不必要.[1] === [1](使用严格相等运算符)也返回false.

JS中的Set()是否有像Java一样的.contains()方法?

不是你想象的方式.您可以进行某种深度比较,如本答案的第一个链接所述.


Bam*_*ieh 5

尽管两者[1]具有相同的值,但它们是两个不同的数组,指向内存中的两个不同位置,因此它们不相等。

您可以使用基本循环来检查

for (let item of mySet.keys()) {
  item.toString() == [1].toString();
  //true on match.
}
Run Code Online (Sandbox Code Playgroud)