Symbol数据类型、Set数据结构和Map数据结构

symbol

symbol函数生成的数据,表示的是独一无二的值。它是js语言的第7种数据类型,

可用于对象的属性名,防止某个属性名被不小心改写或者覆盖,比如一些常量属性可以设置为symbol值。

let mySymbol = Symbol();

// 第一种写法
let a = {};
a[mySymbol] = 'Hello!';

// 第二种写法
let a = {
  [mySymbol]: 'Hello!'
};

// 第三种写法
let a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });

// 以上写法都得到同样结果
a[mySymbol] // "Hello!"

 

Set和Map数据结构

Set和Map的应用场景在于数组去重和数据存储

Set

根据数据结构,Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构

set和数组的区别:除了set可以去重,set是无序的。
1、Set数据结构类似与数组,但是成员的值都是唯一的,没有重复的值。
1、Set可以用于数组内部去除重复成员的方法,Array.from(new Set(array))或者[...new Set(arr)](阮一峰的es6文档有使用set方法处理去除数组中重复元素)结合Array.from
2、 Set可以用于去除字符串里面的重复字符。
3、 Set 不可以对象的去重。因为在Set内部,有判断两个值是否相等的机制类似为===。但是NaN在Set数据结构中也不会重复
2、Set的实例方法 操作数据和遍历的方法。
1、操作数据: add(value)添加某个值,返回Set结构本身 delete(value)删除某个值,返回一个值,表示是否成功。
2、 遍历方法: has(value)返回一个布尔值,表示该值是否为Set的成员。 clear()清除所有成员,没有返回值。
3、Set结构的实例有四个遍历方法,可以用于遍历成员。Set结构的键名和键值为同一个值。
1. keys()返回键名的遍历器。
2. values()返回键值的遍历器。
3. entries()返回键值对的遍历器。
4. forEach()对每个成员执行某种操作,没有返回值。
4、扩展运算符也可以用于Set结构。
5、通过扩展运算符,filter,map等方法也可以用于Set结构。因此使用set结构可以很容易的实现,并集、交集、差集

为什么会出现weakSet?

因为js中对不再被引用的对象会被自动删除,资源也会一同被收回,Set中对象的引用都是强类型化的,并不会允许垃圾回收,为了解决这个问题,es6引入了WeakSet的弱集合,这些集合之所以是”弱的“,是因为他们允许从内存中清除不再需要的被这些集合所引用的对象。
6、weakSet 结构和Set结构类似,也是不重复的值的集合。但是WeakSet的成员只能是对象(对象引用类型),而不能是其他类型的值。不能遍历。
WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。(这个与Set实例方法的意义稍微有些不通话)
WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在 WeakSet 实例之中。

Map

 
1、Map数据结构,类似于对象,也是键值对的集合,但是”键“的范围不限于字符串,各种类型的值(包括对象)都可以当做键。Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。
2、Map数据结构的实例的属性和操作方法
1、size 属性返回Map结构的成员总数
2、set(key,value)设置键名key对应的键值为value,然后返回整个Map结构;
3、读取key对应的键值,如果找不到key,返回undefined;
4、has(key)方法返回布尔值,表示某个键是否在当前Map对象中。
5、delete(key) 方法删除某个键,返回true,如果删除失败,返回false。
6、clear()方法清除所有的成员,没有返回值。
Map结构的实例有四个遍历方法,可以用于遍历成员。
1. keys()返回键名的遍历器。
2. values()返回键值的遍历器。
3. entries()返回所有成员的遍历器。
4. forEach()对每个成员执行某种操作,没有返回值。
1.Map转为数组,,最简便的方法使用扩展运算符。 数组转为Map使用Map构造函数
2.Map转为对象,参考es6文档 使用 for ... of循环,对象转为Map,可以通过Object.entries()实现
3.Map和Json也可以互相转换。
 

总结:

Set本身是一个构造函数,用来生成Set数据结构。内部有判断加入的值是否相同的机制,可用于字符串和数组的去重。
Set数据结构类似数组,arr=[1,2,3];set={1,2,3},成员的值是唯一的。参数可以是数组和字符串。
Map 是一个构造函数,用来生成Map数据结构,是扩展的键值对,键可以为非字符串形式的。
 
map和obj的区别,obj的key值必须为字符窗或者是number。
posted @ 2021-04-23 17:01  香香香。。。。香菜  阅读(275)  评论(0编辑  收藏  举报