一、Map
基于set和array之上構(gòu)建的一個(gè)集合
1、Map的聲明
使用 new 關(guān)鍵字和 Map 構(gòu)造函數(shù)
let m = new Map();
通過二維數(shù)組聲明
var arr = [[1,2],[3,4]]
var map = new Map(arr) //通過二維數(shù)組構(gòu)建的
2、Map的方法和屬性
- set()
- get()
- has()
- delete()
- clear()
- size
初始化之后,可以使用 set()方法再添加鍵/值對(duì)。另外,可以使用 get()和 has()進(jìn)行查詢,可以通過 size 屬性獲取映射中的鍵/值對(duì)的數(shù)量,還可以使用 delete()和clear()刪除值。
const m = new Map();
alert(m.has("firstName")); // false
alert(m.get("firstName")); // undefined
alert(m.size); // 0
m.set("firstName", "Matt")
.set("lastName", "Frisbie");
alert(m.has("firstName")); // true
alert(m.get("firstName")); // Matt
alert(m.size); // 2
m.delete("firstName"); // 只刪除這一個(gè)鍵/值對(duì)
alert(m.has("firstName")); // false
alert(m.has("lastName")); // true
alert(m.size); // 1
m.clear(); // 清除這個(gè)映射實(shí)例中的所有鍵/值對(duì)
alert(m.has("firstName")); // false
alert(m.has("lastName")); // false
alert(m.size); // 0
Map 實(shí)例會(huì)維護(hù)鍵值對(duì)的插入順序,因此可以根據(jù)插入順序執(zhí)行迭代操作。
可以
通過 entries()方法(或者 Symbol.iterator 屬性,它引用 entries())取得這個(gè)迭代器。
keys()和 values()分別返回以插入順序生成鍵和值的迭代器
const m = new Map([
["key1", "val1"],
["key2", "val2"],
["key3", "val3"]
]);
for (let key of m.keys()) {
alert(key);
}
// key1
// key2
// key3
for (let key of m.values()) {
alert(key);
}
// value1
// value2
// value3
weakMap基于weakSet上面構(gòu)建map 也就是他的key是對(duì)象 只能是對(duì)象
二、解構(gòu)
var obj = {username:'jack',password:'123'}
// obj.username
// obj.password
//解構(gòu)來取 (通過key來解構(gòu)對(duì)應(yīng)的obj) {key} = {key:123}
var {password,username} = obj
console.log(username);
console.log(password);
//快速提取對(duì)象里面數(shù)據(jù)
var {age} = {age:18}
console.log(age);
//解構(gòu)取數(shù)組里面的內(nèi)容 按照位置來取對(duì)應(yīng)的值
var [o,p] = ['a','b']
console.log(o);
// 快速讀取值
var {sex} = {username:'jack',password:"123",age:'18',sex:"女"}
console.log(sex);
三、擴(kuò)展運(yùn)算符
...打開數(shù)組拿出里面的內(nèi)容
//擴(kuò)展運(yùn)算符
var arr = [1,3,5]
var arr1 = [2,4,6]
console.log(...arr); //解除數(shù)組的包裝 把他暴露出來 1 3 5
//如果你的方法里面需要,隔開他會(huì)默認(rèn)給你加上一個(gè),
console.log( 'abc'.concat(1,2,3,4,5));
console.log( 'abc'.concat(...arr,...arr1)); //默認(rèn)加上,
四、類
他是用于對(duì)象構(gòu)建的 (類只是一個(gè)構(gòu)建對(duì)象的容器 )調(diào)用這個(gè)class要使用new關(guān)鍵詞。
//類名首字母必須大寫
class Person{
constructor(){ //構(gòu)造器
//this必須在構(gòu)造器里面使用
this.age = 18 //類的屬性
this.sayHello = function(){ //類的方法
console.log('hello')
}
}
}
//構(gòu)建對(duì)象
var person = new Person()
console.log(person.age); //18
person.sayHello() //hello
//類名首字母必須大寫 class不能被重復(fù)定義
class Person1{
//constrctor調(diào)用 new的過程 每一次new 里面的內(nèi)容都會(huì)重新聲明
constructor(age=18,name='jack'){ //構(gòu)造器
//this必須在構(gòu)造器里面使用 this是指向?qū)嵗膶?duì)象
this.age = age //類的屬性
this.name = name
this.sayHello = function(){ //類的方法
console.log('hello')
}
}
run(){//在函數(shù)里面可以訪問對(duì)應(yīng)的this
console.log(this.name+'跑');
}
}
//使用new 調(diào)用的對(duì)應(yīng)構(gòu)造器的時(shí)候 就是在實(shí)例化的過程 而產(chǎn)生的對(duì)象被稱為實(shí)例化對(duì)象
var person = new Person1(18,'jack')
console.log(person); // age:18 name:jack sayHello:fn
var person1 = new Person1()
console.log(person1);
person1.run()
console.log( person1.sayHello == person.sayHello);//false
console.log( person1.run == person.run);//true
注意事項(xiàng)
- class 修飾的類 類名首字母必須大寫
- class 不允許重復(fù)聲明
- class 里面this只能存在于constructor(構(gòu)造器)里面
- class 里面this指向當(dāng)前實(shí)例化對(duì)象
- 在實(shí)例化的過程 new的過程的 調(diào)用的constructor函數(shù) 跟其他函數(shù)無關(guān)(所以當(dāng)前在constructor都會(huì)重新聲明一次)
extends關(guān)鍵詞
extends 用于繼承 他會(huì)擁有父類所有的非私有的屬性及方法
class Person{
constructor(){
this.age = 18
}
run(){
console.log('跑');
}
}
//extends 關(guān)鍵詞聲明以后 在對(duì)應(yīng)的constructor里面想要使用this 必須先寫super()
class Son extends Person{
constructor(){
super()//指向父類Person的構(gòu)造器constructor
this.name = 'jack'
}
}
var son = new Son()
console.log(son);//獲取不到run的
注意事項(xiàng)
- 在子類構(gòu)造里面如果想要使用this 必須先要使用super()
- super指向父類的構(gòu)造器
- 子類無法獲取構(gòu)造器之外的函數(shù)