[...new set(array)] 在 JavaScript 中如何工作?

Has*_*jar 3 javascript object javascript-objects

考虑:

const ages = [26, 27, 26, 26, 28, 28, 29, 29, 30]
const uniqueAges = [...new Set(ages)]

console.log(uniqueAges) // [26,27,28,29,30]
Run Code Online (Sandbox Code Playgroud)

我知道扩展语法。我搜索了set,但没有找到有关它如何工作的解释。

如何设置商品比较并找到相似商品?

如果设置,则在比较中使用循环。

Ama*_*dan 7

Set只能包含唯一值;根据MDN,以下是等值的构成:

由于 中的每个值都Set必须是唯一的,因此将检查值是否相等。在 ECMAScript 规范的早期版本中,这与运算符中使用的算法并不基于相同的算法===。具体来说,对于Sets, +0(严格​​等于-0) 和-0是不同的值。然而,ECMAScript 2015 规范对此进行了更改。有关详细信息,请参阅浏览器兼容性表中的“-0和的键相等”。0

NaN并且undefined还可以存储在Set. 所有NaN值都是相等的(即被NaN认为与 相同NaN,即使NaN !== NaN)。

Set使用传递数组的可迭代接口创建 时存在隐式循环。中还有一个循环...,它解压一个可迭代对象。

然而,检查元素是否已经存在Set并不是使用循环来完成的 - 出于所有意图和目的,您可以将 a 视为Set只有键而没有值的字典。代码几乎相同:

const ages = [26, 27, 26, 26, 28, 28, 29, 29, 30]

const temp = {};
for (const age of ages) {
  temp[age] = true;
}

const uniqueAges = [];
for (const age in temp) {
  uniqueAges.push(age);
}

console.log(uniqueAges);
Run Code Online (Sandbox Code Playgroud)

我故意写这种“低科技”的方式来说明正在发生的事情;请注意,对象键始终是字符串,因此结果将被字符串化。使用Map或同时将年龄存储为将使它在效果上与OP的代码更加相似,但为了说明起见,我想保持简单。