【JavaScript】ES6新增的数据类型(Symbol,Set,Map,weakSet,weakMap)

回顾一下js中七种数据类型:
number, string, bool,null,undefined,symbol, Object。前面六种是基本数据类型,Object是复杂数据类型
Object里面又分为:Array Function Date object
ES6新增的数据类型(Set,Map,weakSet,weakMap)都属于Object

Symbol

Symbol的使用:

var a = Symbol()
注意下面这种写法是错误的:
var a = new Symbol()

Symbol是一个独一无二的值,没有值和他相等。 Symbol() !== Symbol()

var a = Symbol()
var b = Symbol()
a === b //false

Symbol能干什么?一个symbol值能作为对象属性的标识符

比如:
var obj = {}
obj['name'] = 'zhangsan'
obj[Symbol()] = 'hello'

在这里插入图片描述
这样用的意义是什么呢? 举个例子,当你只关心一个对象的value,不关心的他的key时就可以使用symbol

var obj = {}
obj['asdasdczxczxcadladoiqoueoeqi'] = 'hello'   //我不关心这个key是什么
obj[Symbol()] = 'hello' 

typeof 的返回值

typeof Symbol() === 'symbol'   //true

symbol的中文意思的符号,举个例子:圆形,三角形,五角星都是一种符号,你知道他们的意思吗?你只知道那个符号的意思是什么。
对于symbol也是这样理解,你不关心他是什么,只要知道他的意思即可

Set,集合,里面可以存放任何值(基础类型和引用类型)

使用set对象:

let mySet = new Set();
mySet.add(1); // Set(1) {1}
mySet.add(5); // Set(2) {1, 5}    Set会自动去重
mySet.add(5); // Set { 1, 5 }
mySet.add("some text"); // Set(3) {1, 5, "some text"}
var o = {a: 1, b: 2};
mySet.add(o);
mySet.add({a: 1, b: 2}); // o 指向的是不同的对象,所以没问题

迭代Set

for (let item of mySet) console.log(item);

在这里插入图片描述
更多Set内容:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Set

Map 对象保存键值对。任何值(基础类型和引用类型) 都可以作为一个键或一个值。

map弥补了对象的缺点,可以使用任何值作为下标, 对象的下标只能是string类型
map的使用:

var myMap = new Map();
 
var keyObj = {},
    keyFunc = function () {},
    keyString = "a string";
 
// 添加键
myMap.set(keyString, "和键'a string'关联的值");
myMap.set(keyObj, "和键keyObj关联的值");
myMap.set(keyFunc, "和键keyFunc关联的值");
 
myMap.size; // 3

迭代map

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}

在这里插入图片描述

WeakSet 允许你将对象的弱引用存储在一个集合中。

在说到WeakSet的时候先来说一下引用和垃圾回收
引用是复杂数据类型的说法
看一个例子:

var a = {name: 'zhangsan'}

现在,这a就引用了这个对象,在内存中就是这样的
在这里插入图片描述
当a不在引用这个对象时,这个对象就没有人能使用它,它就会被垃圾回收,
比如:

var a = {name: 'zhangsan'}
a = null

在这里插入图片描述
弱引用不属于垃圾回收的计算范围
WeakSet和 Set 对象的区别有两点:

1,WeakSet 对象中只能存放对象引用, 不能存放值, 而 Set 对象都可以.
2,WeakSet 对象中存储的对象值都是被弱引用的, 如果没有其他的变量或属性引用这个对象值, 则这个对象值会被当成垃圾回收掉.
比如:

var o = {name:'zhangsan'}
var ws = new WeakSet()
ws.add(o)

这时再执行:

o = null

那么o引用的这个对象会被回收,因为weakSet是弱引用,他也会失去和这个对象的连接
可以利用虚线理解弱引用:
在这里插入图片描述
当a和对象的引用被切断时,ws就自动和对象切断

WeakMap 对象是一组键/值对的集合,其中的键一定是弱引用的,而值可以是任意的。

WeakMap与Map的主要区别在于两点:

1,WeakMap对key的引用是弱引用
2,WeakMap的key只能是对象

深入了解weakMap:https://zhuanlan.zhihu.com/p/25454328

在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值