Symbol
Symbol是ES6中新增的一个基本数据类型,翻译为符号。
在ES6之前,对象的属性名都是字符串形式,那么很容易造成属性名的冲突;
比如原来有一个对象,我们希望在其中添加一个新的属性和值,但是我们在不确定它原来内部有什么内容的情况下,
很容易造成冲突,从而覆盖掉它内部的某个属性;
-
Symbol就是为了解决上面的问题,用来生成一个独一无二的值。
-
Symbol值是通过Symbol函数来生成的,生成后可以作为 属性名;
-
也就是在ES6中,对象的属性名可以使用字符串,也可以使用Symbol值;
-
Symbol即使多次创建值,它们也是不同的:Symbol函数执行后每次创建出来的值都是独一无二的;
我们也可以在创建Symbol值的时候传入一个描述description:这个是ES2019(ES10)新增的特性;
我们通常会使用Symbol在对象中表示唯一的属性名:
// aaa表示属性名 s1中有一个属性名字为aaa
const s1 = Symbol('aaa')
const s2 = Symbol('111')
const obj = {}
//1. 属性名赋值
;(obj[s1] = 'bbbb'), (obj[s2] = '222')
console.log(obj)
//2.字面量直接赋值
const info = {
[s1]: '111',
[s2]: '222'
}
console.log(info)
创建相同的Symbol
我们可以使用Symbol.for方法来做到这一点;
const a1 = Symbol.for('aaaa')
const a2 = Symbol.for('aaaa')
console.log(a1 === a2)
并且我们可以通过Symbol.keyFor方法来获取对应的key;
const key = Symbol.keyFor(a1)
console.log(key)
Set 去重
Set是一个新增的数据结构,可以用来保存数据,类似于数组,但是和数组的区别是元素不能重复。
创建Set我们需要通过Set构造函数(暂时没有字面量创建的方式):
我们可以发现Set中存放的元素是不会重复的,那么Set有一个非常常用的功能就是给数组去重。
Set常见的属性:
- psize:返回Set中元素的个数;
Set常用的方法:
-
add(value):添加某个元素,返回Set对象本身;
-
delete(value):从set中删除和这个值相等的元素,返回boolean类型;
-
has(value):判断set中是否存在某个元素,返回boolean类型;
-
clear():清空set中所有的元素,没有返回值;
-
forEach(callback):通过forEach遍历set;
另外Set是支持for of的遍历的。
const set = new Set()
set.add(10)
set.add(20)
set.add(30)
set.add(40)
console.log(set)
//1.数组去重
const arr = [11, 22, 33, 44, 46, 66, 66]
const arrSet = new Set(arr)
//删除
arrSet.delete(66)
// 遍历
const newArr = [...arrSet]
//forEach
arrSet.forEach(item => {
console.log(item)
})
//for...of
for (const item of arrSet) {
console.log(item)
}
//size 属性 判断长度
console.log(arrSet.size)
// has 是否包含 返回布尔类型
console.log(arrSet.has(44))
WeakSet
与Set有什么区别呢?
-
区别一:WeakSet中只能存放对象类型,不能存放基本数据类型;
-
区别二:WeakSet对元素的引用是弱引用,如果没有其他引用对某个对象进行引用,那么GC可以对该对象进行回收; 弱引用:仍然可以使用里面的数据,但是GC回收依旧会对其进行回收
WeakSet常见的方法:
-
add(value):添加某个元素,返回WeakSet对象本身;
-
delete(value):从WeakSet中删除和这个值相等的元素,返回boolean类型;
-
has(value):判断WeakSet中是否存在某个元素,返回boolean类型
注意:WeakSet不能遍历
因为WeakSet只是对对象的弱引用,如果我们遍历获取到其中的元素,那么有可能造成对象不能正常的销毁。
所以存储到WeakSet中的对象是没办法获取的;
Map 键值对集合
用于存储映射关系。键的范围不限于字符串,各种类型的值都可以当作键,键与内存地址绑定,内存地址不同,就视为两个键。
但是我们可能会想,在之前我们可以使用对象来存储映射关系,他们有什么区别呢?
事实上我们对象存储映射关系只能用字符串(ES6新增了Symbol)作为属性名(key);
某些情况下我们可能希望通过其他类型作为key,比如对象,这个时候会自动将对象转成字符串来作为key;
Map常见的属性:
- size:返回Map中元素的个数;
Map常见的方法:
-
set(key, value):在Map中添加key、value,并且返回整个Map对象;
-
get(key):根据key获取Map中的value;
-
has(key):判断是否包括某一个key,返回Boolean类型;
-
delete(key):根据key删除一个键值对,返回Boolean类型;
-
clear():清空所有的元素;
-
forEach(callback, [, thisArg]):通过forEach遍历Map;
Map也可以通过for of进行遍历
const map2 = new Map([
[1, '111'],
[2, '222']
])
//1.设置新值
map2.set('name', 'why')
//2.读取value值
console.log(map2.get('name'))
//3.size
console.log(map2.size)
//4.删除
map2.delete('name')
//遍历
map2.forEach((item, key) => {
console.log(item, key)
})
//以对象为键,
const obj1 = { name: 'why', age: 17 }
const obj2 = { name: 'hhhh', age: 18 }
const map3 = new Map()
//对象为键,1111为value值
map3.set(obj1,'1111')
console.log(map3)
WeakMap
与Map有的区别
-
区别一:WeakMap的key只能使用对象,不接受其他的类型作为key;
-
区别二:WeakMap的key对对象想的引用是弱引用,如果没有其他引用引用这个对象,那么GC可以回收该对象;
WeakMap常见的方法有四个:
-
set(key, value):在Map中添加key、value,并且返回整个Map对象;
-
get(key):根据key获取Map中的value;
-
has(key):判断是否包括某一个key,返回Boolean类型;
-
delete(key):根据key删除一个键值对,返回Boolean类型;
不能进行遍历
WeakMap的应用(vue3响应式原理)
Array Includes(ES7)
判断一个数组中是否包含某个元素,需要通过 indexOf 获取结果,并且判断是否为 -1。
在ES7中,我们可以通过includes来判断一个数组中是否包含一个指定的元素,根据情况,如果包含则返回 true,否则返回false
const name = ['aa', 'bb', 'cc', 'cccccc'.NaN]
if (name.includes('aa')) {
console.log('yes')
}
//indexof 不能对NaN进行判断
//includes 则可以进行判断
if (name.includes(NaN)) {
console.log('yes')
}
exponentiation 指数运算符(ES7)
**
const result = 3 ** 3
console.log(result)//27