set去重原理 ,相等比较(==, ===, Object.is, SameValueZero)

197 阅读2分钟

问: set去重的原理?
答: 比较值。
问: 怎么比较?
答: ===或者是==???

看到这个问题,一脸懵逼,set去重大家应该都知道,但内部原理,额, 查了一下,set使用的是一种叫SameValueZero(同0相等)的比较方法,set, Array.includes内部都用到了这个方法,这个方法没有开放。

相等比较文档:

developer.mozilla.org/en-US/docs/…

一共有四种方法:

  1. ==
  • 不同类型会做类型转换后再比较,
  • 如果操作数之一是对象,会调用toString和valueof转换为原始值
  1. ===
  • 全等,先判断类型,再判断值
  • +0 === -0 // true
  • NaN === NaN // false
  1. Object.is(SameValue)
  • Object.is(0, +0) // true
  • Object.is(0, -0) // false
  • Object.is(NaN, NaN) // true
  1. SameValueZero(相对于Object.js)
  • -0和0相等,
  • +0和-0相等
  • NaN也相等

主要在-0,还有NaN之间的比较

那么问题来了, NaN我们知道是非数字,-0是个什么东西?

这是 IEEE-754、符号和幅度表示和一个补码表示的一个公认缺陷,零 [0] 有两个或多个表示。其他一些编程语言使用称为二进制补码的东西来规避对两个零的需求。

浮点数的第一位是符号位,0为正,1为负。于是就有了0000000000000000000000000000000000000000000000000000000000000000(64个0)和1000000000000000000000000000000000000000000000000000000000000000(1后面63个0)。
这两个值只有符号位不同,而在数学上, 0不分正负。于是就有了+0==0==-0

+0 和 -0的区别

1/-0;  // -Infinity 负无穷
1/+0;  // Infinity 正无穷
1/0;   // Infinity 正无穷

set常用

add(value):新增,相当于 array里的push。
delete(value):存在即删除集合中value。
has(value):判断集合中是否存在 value。
clear():清空集合

keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回键值对的遍历器。
forEach():使用回调函数遍历每个成员

map常用

set(key, val): 向Map中添加新元素
get(key): 通过键值查找特定的数值并返回
has(key): 判断Map对象中是否有Key所对应的值,有返回true,否则返回false
delete(key): 通过键值从Map中移除对应的数据
clear(): 将这个Map中的所有元素删除

keys():返回键名的遍历器。
values():返回键值的遍历器。
entries():返回键值对的遍历器。
forEach():使用回调函数遍历每个成员