ES6中Set(集合)、Map以及class类

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);

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值