数据结构

数据结构

set 数据类型

  • 内部成员不可以重复
const a = new Set();
//a是实例对象,可以调用对象的属性和方法
// add() 方法 向集合中添加数据
a.add(1);
console.log(a);
// add()的返回值就是集合对象本身,所以可以链式调用
// 添加时如果有重复数据,会忽略重复的,只保存一个
a.add(1).add(2).add(2);
// 打印出 a 为{1, 2}
console.log(a);
  • 和数组类似,所以可以使用相同方法
  1. forEach()
    遍历数组或Set创建的集合
const a = new Set();
//a是实例对象,可以调用对象的属性和方法
a.add(1);
a.add(1).add(2).add(3);
//简写函数
a.forEach(i => {
    console.log(i);
});
// ES6之前的方法
a.forEach(function (i) {
    console.log(i);
});
  1. ES2015 中的 for of 循环
    也可以用来遍历数组和集合中每一项
const arr = [1, 2, 3, 4, 4, 5, 6];
const s1 = new Set(arr);
for (let i of s1) {
    console.log(i);
}
  1. size 集合长度
    集合中的数据项数
const arr = [1, 2, 3, 4, 5, 6];
const s1 = new Set(arr);
//打印出 6 
console.log(s1.size);
  • 集合自己的方法
  1. has():集合中是否有某个值
    判断集合 s1 中是否含有20,如果有返回true,没有返回false
    s1.has(20);

  2. delete():删除集合中的值
    删除集合中的3,删除成功返回值为true,不成功false(删除集合中没有的值就会返回false)
    s1.delete(3);

  3. clear():删除集合中所有值
    清空后集合变成空集合
    s1.clear()

  • 应用:常用在数组去重
const arr = [1, 2, 3, 4, 4, 5, 6];
// 构造函数方法创建Set实例对象
const b = new Set(arr);
// b 为 {1, 2, 3, 4, 5, 6},是一个集合
console.log(b);
//ES6新方法 把b集合变为数组c
const c = Array.from(b);
// 展开操作符方法变数组
const c = [...new Set(arr)]
console.log(c);

Map 数据结构

  • 和对象类似的数据类型,内部属性名(键)可以是任何类型,不会和对象一样转化成字符串
  • 也有 has(), delete(), clear()方法
  • 可也用for each 遍历
// value是属性值,key是属性名
map.forEach((value, key) => {
    console.log(key, value);
});
const obj = {};
obj[true] = "boolean";
obj[123] = "number";
obj[{a: 1}] = "object";
console.log(obj);
// Object.keys() 方法可以将对象内属性名提出来组成数组
//数组的每一项都是字符串,证明对象的属性名在使用时都是字符串形式,在传入的时候如果不是字符串,会自动的将数据通过toString()方法转化成字符串
Object.keys(obj);
//['123', 'true', '[object Object]']
//任何对象用toString()方法后都会转化成'[object Object]',这就会出现名 值不能对应的情况
console.log(Object.keys(obj));

Symbol

  • 一种全新的原始数据类型
  • 最主要的作用就是为对象添加独一无二的属性标识符
  • console.log(Symbol()===Symbol());结果为false,证明了Symbol()是独一无二的
  • ES2015之后,对象的键名(属性名)可以有两种类型:String和Symbol。但是for in 循环和Object.keys() 无法获取到Symbol类型属性名,说明Symbol经常会被忽略。可以使用Object.getOwnPropertySymbols(obj),单独获取Symbol类型
  • 通过Symbol方式定义的属性是对象的私有成员(在对象外部无法使用)。
const obj = {
    // 需要用计算属性名的[]方式来设置属性名,没有[]会出错
    [Symbol()]: 123,
    [Symbol()]: 456
};
//打印结果为undefined,因为Symbol方式定义的属性,不能在对象外引用。是对象的私有成员。
//因为外面的Symbol也是独一无二的,所以无法对应对象内部的Symbol。
console.log(obj[Symbol()]);
// 也可以用这种方法添加
const obj = {};
// 可以在内部传入描述文本,来来区分Symbol
obj[Symbol(123)] = 123;
obj[Symbol()] = 456;
// obj 为{Symbol(123): 123, Symbol(): 456},因为Symbol唯一的,所以两个属性名不会冲突
console.log(obj);

重复使用一个Symbol的方法

  • 全局定义一个变量,使用a变量
    const a = Symbol()
  • 使用for()方法
// for()内的值会自动转化成字符串
const a = Symbol.for(true)
const b = Symbol.for("true")
// 此时a===b
console.log(a===b)

内置的Symbol常量

const obj = {}
obj.toString()
// 任何对象使用toString()方法,得到的都是[object Object],这个结果为对象的toString标签
console.log(obj.toString());

//通过Symbol提供的常量toStringTag改变标签
const obj = {
    [Symbol.toStringTag]: "XObject"
}
// 标签变为[object XObject]
console.log(obj.toString());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值