ES6深入浅出-10 ES6新增的数据类型-2.Set与数组去重

一种新的数据类型,它是对象的一种,Set,很像数组,又不是数组。
Set 类型 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set


Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

如果里面有重复的会自动去重。set可以理解为去重之后的数组,永远不允许有重复的元素存在。

无论是原始值还是对象引用


如果有重复的字符串,也会去重。

null和undefined也会去重了。

定义一个空对象a。set里面加入重复的a对象 也会去重。

它只会对引用去重

如果是两个不同的空对象。a和b是不同的,所以不会去重。所以它是同一个引用去重,不同的引用,没有去重。

在new set之前的js是怎么去重的

常见的面试题,数组去重。
把array[i]当做数组hash的属性名。如果有重复的就是把重复的属性名再次编程true

打印出来的结果。



然后把hash再循环一遍,上面是遍历数字,下面是遍历对象

输出 结果


思路就是:把数组放在一个对象里面,一有就设置为true,最后把对象的key都打出来。
这个方法的缺点:打印的值编程了字符串。

在ES6之前,js的对象只支持一种下标,就是字符串。

假设中间有个字符串的4,和后面的数字4。


对于我们这个函数而言,数字4和字符串4没有区别。下标最终都是字符串。

定义hash一个下标为数字4的,最终也会转换为字符串

再来一个下标为字符串4的,hash的值还是只有4的下标。所以不管你是数字还是字符串,最终都是字符串

用对象的下标来去重最大的问题是:只能统计字符串。一旦他们两个转化为字符串无法区分。就做不到了。

如果数字内有个对象,怎么去重?

数组内加上对象,再去重。出现这种问题的原因是下标只支持字符串。所以当你以这个对象下标的时候

所有对象编程字符串都是一个类似[object]这样的字符串。

声明一个空对象,按后,a.toString打印出来。对象编程字符串的结果。

让js发现对象的下标是对象的时候,就会调用这个对象的toString()方法
所以另外一个缺点是无法统计对象

 

新的算法ES6的set

直接return一个new set然后把array传递进去。打印出来的结果是一个Set对象。


把set转换成数组。Array.form会接收任意一个东西,并尝试把它变成一个数组。
先用new set()去重,然后转换成一个array数组。



array.form有一种简单的写法。使用展开操作符。

 

API

new Set然后add往里面塞东西,重复的不会加进去。






循环set用for of来迭代

set平时写代码不常用

只需要知道怎么用set给数组去重就可以了。

结束


 

 

posted @ 2019-11-12 20:38  高山-景行  阅读(541)  评论(0编辑  收藏  举报