目录
Set(集合)
- ES6提供了新的数据结构Set(集合)。
- 类似于数组,但是成员的值都是唯一的
- 集合实现了iterator接口,所以可以使用扩展运算符和for…of进行遍历
- 申明一个
Set
语法:let s = new Set();
- 使用
typeof
类型检测返回一个object
- 可以在申明时,为Set集合中传入一个可迭代的参数,例如数组。
let s= new Set([1,2,3,4]);
,其中会自动进行去重操作
常用的属性和方法
size
- 该属性会返回集合的元素个数
let s = new Set(["江流", "江流", "心猿", "心猿",
"木龙", "木龙"]);//集合会自动去重操作
console.log(s);
console.log(s.size);//3
add()
- 该方法可以为集合增加一个新元素,返回到当前集合
let s = new Set(["江流", "江流", "心猿", "心猿", "木龙", "木龙"]);//集合会自动去重操作
s.add("刀圭");
s.add("意马");
console.log(s);//'江流', '心猿', '木龙', '刀圭', '意马'
delete()
- 该方法可以删除一个指定元素,返回boolean值
let s = new Set(["江流", "心猿", "木龙", "意马"]);//集合会自动去重操作
s.delete("木龙")
console.log(s);//"江流", "心猿", "意马"
has()
- 该方法检测集合中是否包含某个元素,返回boolean值
let s = new Set(["江流", "心猿", "木龙", "意马"]);//集合会自动去重操作
console.log(s.has("心猿"));//true
console.log(s.has("刀圭"));//false
clear()
- 该方法可以清空一个集合
let s = new Set(["江流", "心猿", "木龙", "意马"]);//集合会自动去重操作
s.clear();
console.log(s);
for…of遍历
let s = new Set(["江流", "心猿", "木龙", "意马"]);//集合会自动去重操作
for(let value of s)
{
console.log(value);
}
Set 实践
数组去重
let arr = [1, 2, 3, 4, 5, 4, 3, 2, 1];
// 数组去重
let result = [...new Set(arr)];
console.log(result);//[1, 2, 3, 4, 5]
交集A ∩ B
let arr1 = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let arr2 = [4, 5, 6, 5, 6]
// 交集
let s2 = new Set(arr2);
let result = [...new Set(arr1)].filter(item =>s2.has(item));
console.log(result);//[ 4, 5 ]
并集A U B
let arr1 = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let arr2 = [4, 5, 6, 5, 6]
// 并集
let union = [...new Set([...arr1, ...arr2])];
console.log(union);//[ 1, 2, 3, 4, 5, 6 ]
差集A - B
let arr1 = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let arr2 = [4, 5, 6, 5, 6]
// 交集 arr1 - arr2
let s2 = new Set(arr2);
let result = [...new Set(arr1)].filter(item =>!s2.has(item));
console.log(result);//[ 1, 2, 3 ]
Map
- ES6提供了Map数据结构。它类似于对象,也是键值对的集合。
- 但是键的范围不限于字符串,各类数据的值(包括对象)都可以当作键。
- Map也实现了iterator接口,所以可以使用扩展运算符和**for…of…**进行遍历。
Map常用属性和方法
size
- 该属性返回Map的元素个数
set()
- 该方法可以增加一个新元素,返回当前Map,键的范围不限于字符串,各类数据的值(包括对象)都可以当作键。
// 申明Map
let m = new Map();
// 添加元素
m.set("name","江流儿");
m.set("fun", function(){
console.log("马少爷!您真有钱!!");
});
// 申明一个对象
let key = {name:"江流"};
m.set(key, ["心猿", "木龙", "意马"])
console.log(m);
get()
- 返回键名对象的键值
// 申明Map
let m = new Map();
// 添加元素
m.set("name","江流儿");
m.set("fun", function(){
console.log("马少爷!您真有钱!!");
});
// 申明一个对象
let key = {name:"江流"};
m.set(key, ["心猿", "木龙", "意马"])
// 获取
console.log(m.get('name'));//江流儿
delete()
- 该方法可以删除一个键值
// 申明Map
let m = new Map();
// 添加元素
m.set("name","江流儿");
m.set("fun", function(){
console.log("马少爷!您真有钱!!");
});
// 申明一个对象
let key = {name:"江流"};
m.set(key, ["心猿", "木龙", "意马"])
// 删除
m.delete('name')
console.log(m);
has()
- 检测Map中是否包含某个元素,返回boolean值
// 申明Map
let m = new Map();
// 添加元素
m.set("name","江流儿");
m.set("fun", function(){
console.log("马少爷!您真有钱!!");
});
// 申明一个对象
let key = {name:"江流"};
m.set(key, ["心猿", "木龙", "意马"])
console.log(m.has('name'));//ture
clear()
- 清空集合,返回undefined
// 申明Map
let m = new Map();
// 添加元素
m.set("name","江流儿");
m.set("fun", function(){
console.log("马少爷!您真有钱!!");
});
// 申明一个对象
let key = {name:"江流"};
m.set(key, ["心猿", "木龙", "意马"])
// 清空
m.clear();
console.log(m);
for…of遍历
// 申明Map
let m = new Map();
// 添加元素
m.set("name","江流儿");
m.set("fun", function(){
console.log("马少爷!您真有钱!!");
});
// 申明一个对象
let key = {name:"江流"};
m.set(key, ["心猿", "木龙", "意马"])
// 遍历
for(let v of m)
{
console.log(v);
}
class类
- ES6引入了Class(类)这个概念,作为对象的模板。
- 通过class关键字,可以定义类
- 新的class写法可以让对象原型的写法更加清晰、更加像面向对象编程的语法
class申明类
ES5创建类的写法
// 手机
function Phone(brand, price)
{
this.brand = brand;
this.price = price;
}
// 添加方法
Phone.prototype.call = function(){
console.log("我可以打电话!");
}
// 实例化对象
let Xiaomi = new Phone("小米", 3999);
Xiaomi.call();
console.log(Xiaomi);
ES6使用class创建类的写法:
/*/ 手机
function Phone(brand, price)
{
this.brand = brand;
this.price = price;
}
// 添加方法
Phone.prototype.call = function(){
console.log("我可以打电话!");
}
// 实例化对象
let Xiaomi = new Phone("小米", 3999);
Xiaomi.call();
console.log(Xiaomi);
*/
class Phone{
// 构造方法
constructor(brand, price){
this.brand = brand;
this.price = price;
}
// 方法必须使用该语法,不能使用ES5的对象完整形式
call(){
console.log("我可以打电话!!");
}
}
let HUAWEI = new Phone("HUAWEI", 4999);
console.log(HUAWEI);
static 定义静态方法和属性
- 静态成员是构造函数本身的属性和方法
- 不能被实例化的对象直接访问
ES5中添加静态成员的写法
// 手机
function Phone()
{
}
// ES5添加静态成员
Phone.name = "手机";
Phone.change = function(){
console.log("热爱自己,热爱生活!");
}
// 实例化对象
let Xiaomi = new Phone();
console.log(Xiaomi.name);//undefined
ES6中添加静态成员的写法
class Phone{
// 静态成员
static name = "手机";
static change(){
console.log("热爱自己,热爱生活!");
}
}
// 实例化对象
let HUAWEI = new Phone();
console.log(HUAWEI.name);//undefined
extends继承父类
如果对ES5继承不清楚的话,可以看看我之前的博客:https://blog.youkuaiyun.com/weixin_45660621/article/details/121423001?spm=1001.2014.3001.5501
ES6中继承
// 定义父类
class Phone{
constructor(brand, price){
this.brand = brand;
this.price = price;
}
// 父类成员方法
call(){
console.log("我可以打电话!!");
}
}
// 定义子类
class SmartPhone extends Phone{
//构造方法
constructor(brand, price, color, size)
{
super(brand, price);//基础父类的属性
this.color = color;
this.size = size;
}
photo(){
console.log("拍出你的美!");
}
playGame(){
console.log("支持国内高帧率游戏");
}
}
const Xiaomi = new SmartPhone("小米", "3999", "珍珠白","4.7")
console.log(Xiaomi);
Xiaomi.call();//调用父类的方法
Xiaomi.photo();//调用子类的方法
Xiaomi.playGame();
getter和setter
- ES6支持通过getter、setter在原型上定义属性。
- 创建getter的时候需要用关键字get;创建setter的时候需要用关键字set。
- 通过该方法可以到达动态修改实例的属性值。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
get name() {
return this._name
}
set name(newName) {
this._name = newName
}
get age() {
return this._age;
}
set age(newValue) {
this._age = newValue
}
}
let p = new Person('张三', 20);
console.log("修改前:", p.name + ":" + p.age);
//动态修改年龄和姓名
p._age = 16;
p._name = "李四";
console.log("动态修改后:", p.name + ":" + p.age);