数据结构
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);
- 和数组类似,所以可以使用相同方法
- 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);
});
- 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);
}
- size 集合长度
集合中的数据项数
const arr = [1, 2, 3, 4, 5, 6];
const s1 = new Set(arr);
//打印出 6
console.log(s1.size);
- 集合自己的方法
-
has():集合中是否有某个值
判断集合 s1 中是否含有20,如果有返回true,没有返回false
s1.has(20);
-
delete():删除集合中的值
删除集合中的3,删除成功返回值为true,不成功false(删除集合中没有的值就会返回false)
s1.delete(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());