BigInt是ES10新加的一种JavaScript数据类型,用来表示表示大于 2^53 - 1 的整数,2^53 - 1是ES10之前,JavaScript所能表示最大的数字
- const bigNum = BigInt(1728371927189372189739217)
- console.log(typeof bigNum) // bigint
Symbol是ES6中新增的一种基本数据类型,它是一个函数,会返回一个Symbol类型的值,每一个Symbol函数返回的值都是唯一的,它们可以被作为对象属性的标识符。
typeof Symbol(); // Symbol
基本用法:使用Symbol值作为对象的key
- let name=Symbol() //声明一个变量,数据类型为symbol
- let obj={
- [name]:"hsq"
- }
- console.log(obj.name);// undefined
- console.log(obj[name]);// hsq
注意:当我们使用变量去定义一个对象key时需要使用[ ]包裹着,否则就会被自动转化成string类型,因为属性使用变量进行定义,所以获取属性值需要使用obj[key]这种方式获取
但是Symbol作为属性的属性不会被枚举出来
- let name=Symbol() //声明一个变量,数据类型为symbol
- let obj={
- [name]:"hsq",
- age:22
- }
- console.log(Object.keys(obj)) // [ 'age' ]
- for(const key in obj) {
- console.log(key) // age
- }
- console.log(JSON.stringify(obj)) // {"age":22}
获取Symbol属性
- let name=Symbol('name') //声明一个变量,数据类型为symbol
- let obj={
- [name]:"hsq",
- age:22
- }
- // 方法一
- console.log(Object.getOwnPropertySymbols(obj)) // [ Symbol(name) ]
- // 方法二
- console.log(Reflect.ownKeys(obj)) // [ 'name', 'age', Symbol(name) ]
应用场景:使用Symbol定义类的私有属性
- class Login {
- constructor(username, password) {
- const PASSWORD = Symbol()
- this.username = username
- this[PASSWORD] = password
- }
- checkPassword(pwd) { return this[PASSWORD] === pwd }
- }
-
- const login = new Login('123456', 'hahah')
-
- console.log(login.PASSWORD) // undefined
- console.log(login[PASSWORD]) // 报错
Set 对象(集合)类似于数组,且成员的值都是唯一的(通俗的理解:不能出现相同的元素)
常用语法
- // 可不传数组
- const set1 = new Set()
- set1.add(1)
- set1.add(2)
- console.log(set1) // Set(2) { 1, 2 }
-
- // 也可传数组
- const set2 = new Set([1, 2, 3])
- // 增加元素 使用 add
- set2.add(4)
- set2.add('林三心')
- console.log(set2) // Set(5) { 1, 2, 3, 4, '林三心' }
- // 是否含有某个元素 使用 has
- console.log(set2.has(2)) // true
- // 查看长度 使用 size
- console.log(set2.size) // 5
- // 删除元素 使用 delete
- set2.delete(2)
- console.log(set2) // Set(4) { 1, 3, 4, '林三心' }
不重复性
- // 两个对象都是不同的指针,所以没法去重
- const set1 = new Set([1, {name: '林三心'}, 2, {name: '林三心'}])
- console.log(set1) // Set(4) { 1, { name: '林三心' }, 2, { name: '林三心' } }
-
-
- // 如果是两个对象是同一指针,则能去重
- const obj = {name: '林三心'}
- const set2 = new Set([1, obj, 2, obj])
- console.log(set2) // Set(3) { 1, { name: '林三心' }, 2 }
-
- 咱们都知道 NaN !== NaN,NaN是自身不等于自身的,但是在Set中他还是会被去重
- const set = new Set([1, NaN, 1, NaN])
- console.log(set) // Set(2) { 1, NaN }
最常用来去重使用,去重方法有很多但是都没有它运行的快。
- const arr = [1, 2, 3, 4, 4, 5, 5, 66, 9, 1]
-
- // Set可利用扩展运算符转为数组哦
- const newArr = [...new Set(arr)]
- console.log(newArr) // [1, 2, 3, 4, 5, 66, 9]
Map 是一组键值对的结构,和 js对象类似。
基本用法
- //初始化`Map`需要一个二维数组(请看 Map 数据结构),或者直接初始化一个空`Map`
- let map = new Map();
-
- //添加key和value值
- map.set('Amy','女')
- map.set('liuQi','男')
-
- //是否存在key,存在返回true,反之为false
- map.has('Amy') //true
- map.has('amy') //false
-
- //根据key获取value
- map.get('Amy') //女
-
- //删除 key为Amy的value
- map.delete('Amy')
- map.get('Amy') //undefined 删除成功
Map对比object最大的好处就是,key不受类型限制
- // 定义map
- const map1 = new Map()
- // 新增键值对 使用 set(key, value)
- map1.set(true, 1)
- map1.set(1, 2)
- map1.set('哈哈', '嘻嘻嘻')
- console.log(map1) // Map(3) { true => 1, 1 => 2, '哈哈' => '嘻嘻嘻' }
- // 判断map是否含有某个key 使用 has(key)
- console.log(map1.has('哈哈')) // true
- // 获取map中某个key对应的value 使用 get(key)
- console.log(map1.get(true)) // 1
- // 删除map中某个键值对 使用 delete(key)
- map1.delete('哈哈')
- console.log(map1) // Map(2) { true => 1, 1 => 2 }
-
- // 定义map,也可传入键值对数组集合
- const map2 = new Map([[true, 1], [1, 2], ['哈哈', '嘻嘻嘻']])
- console.log(map2) // Map(3) { true => 1, 1 => 2, '哈哈' => '嘻嘻嘻' }