【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
上一篇: everything原理解释与简单实现。
下一篇: python画三维(3D)图