es6---es6新增的Bigint、Symbol数据类型,set、map数据结构

一、BigInt

BigInt是ES10新加的一种JavaScript数据类型,用来表示表示大于 2^53 - 1 的整数,2^53 - 1是ES10之前,JavaScript所能表示最大的数字

const bigNum = BigInt(1728371927189372189739217)
console.log(typeof bigNum) // bigint

二、Symbol

SymbolES6中新增的一种基本数据类型,它是一个函数,会返回一个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(集合)

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

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, '哈哈' => '嘻嘻嘻' }

猜你喜欢

转载自blog.csdn.net/h18377528386/article/details/127719980