重学 JS | Set 和 Map 是如何过滤重复值的?
背景
ES6 的 Set 集合是一种包含多个非重复值的有序列表,值与值如果相同,则会自动过滤重复值。它可以用来过滤数组中的重复元素,但是 Set 集合并不是数组的子类,所以不能通过索引直接访问集合中的值,只能通过 has()检测元素是否在集合中,或者通过 size()检测集合中值的数量,同时它支持 forEach()或者遍历器来处理集合中的每个值。
Map 是多个键值对组成的有序集合,键名支持任意数据类型,同时 Map 也是不允许存在重复值,对键名会存在过滤。
那 Set 和 Map 是怎么过滤键值对的?我们通常比较值,有两种方式用“==”或者“===”。
附:对 Set 不熟的可以前往改文字看看
==运算符
“==”运算符在判断相等时,如果两边的变量不是同一类型,会进行强制转换。这会导致(""==false)为 true。
===运算符
“===”运算符只有在无需类型转换运算数就相等的情况下,才返回 true。其将+0 和-0 视为相等,Number.NaN 与 NaN 视为不相等。
学过 Set 和 Map 我们都知道,在这两集合中 1 和“1”是不会被过滤,且 NaN 值会被过滤,只允许存在一个。那么上述两种运算符是不符合了。
Object.is()
该用于判断两个值是否为同一值。而 Set 和 Map 集合便是用此方法进行判断,它的用法如下:
Object.is()判断两个值是否同一值的规则如下:
都是 undefined
都是 null
都是 true 或 false
都是相同长度的字符串且相同字符串顺序排列
都是相同对象(对象同一个引用)
都是数字且
都是+0
都是-0
都是 NaN
或都是非零而且非 NaN 且为同一个值
看完它两值相等的规则,很好的满足 Set 和 Map 集合过滤重复值的需求点。
Polyfill
最后实现下 Object.is 的 Polyfill。
至此关于类型相等可以灵活运用了。
版权声明: 本文为 InfoQ 作者【梁龙先森】的原创文章。
原文链接:【http://xie.infoq.cn/article/a929b67275cb89e3336bdb6f5】。文章转载请联系作者。
评论