欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 09:13:41
...

回顾一下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'

【JavaScript】ES6新增的数据类型(Symbol,Set,Map,weakSet,weakMap)
这样用的意义是什么呢? 举个例子,当你只关心一个对象的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);

【JavaScript】ES6新增的数据类型(Symbol,Set,Map,weakSet,weakMap)
更多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);
}

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

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

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

var a = {name: 'zhangsan'}

现在,这a就引用了这个对象,在内存中就是这样的
【JavaScript】ES6新增的数据类型(Symbol,Set,Map,weakSet,weakMap)
当a不在引用这个对象时,这个对象就没有人能使用它,它就会被垃圾回收,
比如:

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

【JavaScript】ES6新增的数据类型(Symbol,Set,Map,weakSet,weakMap)
弱引用不属于垃圾回收的计算范围
WeakSet和 Set 对象的区别有两点:

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

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

这时再执行:

o = null

那么o引用的这个对象会被回收,因为weakSet是弱引用,他也会失去和这个对象的连接
可以利用虚线理解弱引用:
【JavaScript】ES6新增的数据类型(Symbol,Set,Map,weakSet,weakMap)
当a和对象的引用被切断时,ws就自动和对象切断

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

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

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

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