一滋恬、let和const
這塊相對來說還是比較基礎(chǔ)的浅乔,有了解學(xué)習(xí)
let
和const
定義變量的一些特點(diǎn):不能重復(fù)定義、不存在變量提升庶橱、const
定義常量且需要給初始值等ES6的塊級作用域贮勃、暫時性死區(qū)等
二、變量的結(jié)構(gòu)賦值
按照ES6的一定模式苏章,可以從數(shù)組和對象中提取值,對變量進(jìn)行賦值奏瞬,這就是解構(gòu)
- 數(shù)組解構(gòu)
let a = 1; let b = 2; let c = 3;
let [a,b,c] = [1,2,3];
解構(gòu)不成功枫绅,則變量的值就是
undefined
解構(gòu)賦值允許指定默認(rèn)值
let foo[foo = true] = [];
解構(gòu)不僅用于數(shù)組,還可以用于對象
對象的解構(gòu)賦值是先找到同名屬性硼端,然后再付給對應(yīng)的變量并淋,真正賦值的是后者,不是前者
三珍昨、模版字符串
- 普通字符串
`In JavaScript '\n' is a line-feed.`
- 多行字符串
`In JavaScript this is
not legal.`
- 字符串中嵌入變量
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`;
// Hello Bob, how are you today?
四县耽、數(shù)值的擴(kuò)展
學(xué)習(xí)了一些API句喷,比如
Number.isNaN()
(判斷是不是數(shù)字)、Number.isFinite()
(判斷是否有限)兔毙、Number.parseInt()
(取整)唾琼、Number.isInteger()
(判斷是不是整數(shù))等等學(xué)習(xí)了Math對象的擴(kuò)展,比如
Math.trunc()
(去除小數(shù))澎剥、Math.sign()
(判斷數(shù)值正負(fù))锡溯、Math.cbrt()
(計(jì)算立方根)、Math.floor()
(向下取整)等等
五哑姚、函數(shù)的擴(kuò)展
函數(shù)的參數(shù)可以指定默認(rèn)值
參數(shù)可以跟解構(gòu)賦值默認(rèn)值結(jié)合使用
默認(rèn)值的參數(shù)不是尾參數(shù)祭饭,無法只省略那個參數(shù)
函數(shù)含有
length
屬性,就是參數(shù)的個數(shù)叙量,如果有默認(rèn)值倡蝙,則長度減去默認(rèn)值個數(shù),rest
參數(shù)也不會計(jì)入length屬性函數(shù)的作用域绞佩、嚴(yán)格模式寺鸥、
name
屬性rest
參數(shù)的形式為(...變量名),用來捕獲多函數(shù)多余的參數(shù)征炼,搭配的變量是一個數(shù)組析既,將多余的變量放到數(shù)組中-
箭頭函數(shù)
- 箭頭函數(shù)就是用()=> 定義函數(shù),一個參數(shù)不需要用括號谆奥,兩個或者多個就需要用圓括號把參數(shù)放里面
- 箭頭函數(shù)可以省略
return
- 返回值是對象則需要在對象外面加一個圓括號
- 可以跟架構(gòu)賦值結(jié)合使用
- 不能
new
實(shí)例化眼坏,沒有prototype
原型、沒有arguments
對象 -
this
指向最外層為非箭頭函數(shù)的那個對象 - 不能使用
yield
命令酸些,則不能用作生成器函數(shù)
尾調(diào)優(yōu)化和函數(shù)參數(shù)的尾逗號
六宰译、數(shù)組的擴(kuò)展
- ...擴(kuò)展運(yùn)算符,好比rest參數(shù)的逆運(yùn)算
console.log(1,...[2,3,4,5]);
//1,2,3,4,5
可以用來合并數(shù)組魄懂,可以跟解構(gòu)賦值結(jié)合使用
可以把字符串穿換成數(shù)組
任何具有
Iterator
接口的對象都可以使用擴(kuò)展運(yùn)算符轉(zhuǎn)換為數(shù)組Array.from
可以把一個類數(shù)組對象轉(zhuǎn)變?yōu)橐粋€真正的數(shù)組Array.of
可以把一組值轉(zhuǎn)變?yōu)閿?shù)組還學(xué)習(xí)了
find
沿侈、findIndex
、fill
市栗、includes
等entries
缀拭、keys
、等方法也學(xué)習(xí)了解了
七填帽、對象的擴(kuò)展
允許直接寫入變量和函數(shù)作為對象的屬性和方法蛛淋,用于函數(shù)的返回值
Object.is
方法判斷兩個值是不是嚴(yán)格相等Object.assign
方法用于對象的合并,還可以實(shí)現(xiàn)一定程度的拷貝(不可枚舉的屬性不能拷貝篡腌,繼承屬性不能拷貝)還學(xué)習(xí)了
__proto__
褐荷、Object.setPrototypeOf()
、Object.getPrototypeOf()
嘹悼、Object.keys()
叛甫、Object.values()
层宫、Object.entriess()
等一些API
八、Set和Map數(shù)據(jù)結(jié)構(gòu)
Set 是一個構(gòu)造函數(shù)其监,可以用來生成Set數(shù)據(jù)結(jié)構(gòu)萌腿,Set 的成員是唯一的,則可以用來進(jìn)行數(shù)組的去重
學(xué)習(xí)到了 Set 身上的一些API棠赛,比如 add (添加)哮奇、size(長度)、delete(刪除)睛约、clear(清除)鼎俘、has(是否包含)等
數(shù)組的 map 和 filter 方法也是可以用在 Set 身上
Map 本質(zhì)上是鍵值對的集合,它身上也是有很多的 API 辩涝,也進(jìn)行了學(xué)習(xí)了解
對一個鍵值進(jìn)行兩次賦值贸伐,則后面的會覆蓋前面的
const map = new Map();
map.set(1,'a').set(1,'b');
map.get(1); //'b'
- 可以進(jìn)行Map和數(shù)組、數(shù)組怔揩、JSON 之間的轉(zhuǎn)化
九捉邢、Iterator和for...of
Iterator
是個遍歷器,具有next
方法商膊,調(diào)用一次伏伐,指針指向他內(nèi)部的下一個數(shù)據(jù)結(jié)構(gòu),不斷調(diào)用晕拆,直到結(jié)束默認(rèn)的接口部署在數(shù)據(jù)結(jié)構(gòu)的
Symbol.iterator
屬性上藐翎,也就是說有這個屬性,那么就是可以遍歷的擴(kuò)展運(yùn)算符(...)會默認(rèn)調(diào)用
iterator
接口具有這個接口的就是可以遍歷的实幕,就可以使用 for...of 進(jìn)行遍歷
for...of 可以獲得數(shù)組的鍵值吝镣,for...in 獲得鍵名(索引)
十、Symbol
Symbol 是一種新的數(shù)據(jù)類型昆庇,表示獨(dú)一無二的值
Symbol()末贾,無論括號里面有沒有參數(shù),這兩個值都不相等
Symbol.for()整吆,括號里參數(shù)相同拱撵,則就是同一個值,就是相等的
Symbol.keyfor(),則表示一個已經(jīng)登記的 Symbol 類型值的 key
十一表蝙、Promise
promise是一種異步編程解決方案裕膀,里面有未來會結(jié)束的事件,有三種狀態(tài)勇哗,pending(進(jìn)行中)、fulfilled(成功)寸齐、rejected(失斢怠)
promise 對象是一個構(gòu)造函數(shù)
var promise = new Promise(function(res,rej)){
if(/異步操作成功/){
resolve(val)
}else{
rej(reason)
}
}
promise實(shí)例生成后抄谐,可以用 then 方法來分別制定成功和失敗的回調(diào)函數(shù)
then方法可以實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,可以將上一步結(jié)束的值作為參數(shù)傳給下一個 then
promise.all()
扰法、promise.race()
也納入了學(xué)習(xí)內(nèi)容中并嘗試結(jié)合一些資料和教程蛹含,實(shí)現(xiàn)了一個自己的 promise(部分功能)
//依據(jù) promise a+ 規(guī)范
function MyPromise(exector) {
var self = this;
self.state = 'pending';
self.resolveValue = null; //存儲成功的返回值用作then執(zhí)行的時候的參數(shù)
self.rejectValue = null; //存儲失敗的返回值用作then執(zhí)行的時候的參數(shù)
self.ResolveCallBackList = []; //存儲then里面的回調(diào)函數(shù)
self.RejectCallBackList = [];
//成功執(zhí)行
function resolve(value) {
if (self.state === 'pending') {
self.state = 'fulfilled';
self.resolveValue = value;
self.ResolveCallBackList.forEach(function(ele) { //異步操作完成到執(zhí)行這個方法的時候從數(shù)組里拿出來執(zhí)行
ele();
})
}
};
//失敗執(zhí)行
function reject(reason) {
if (self.state === 'pending') {
self.state = 'rejected';
self.rejectValue = reason;
self.RejectCallBackList.forEach(function(ele) { //異步操作完成到執(zhí)行這個方法的時候從數(shù)組里拿出來執(zhí)行
ele();
})
}
}
//異常處理
try {
exector(resolve, reject); //同步執(zhí)行
} catch (e) {
reject(e); //接受同步執(zhí)行報(bào)出的錯誤
}
}
//處理各種返回值
function ResolutionReturnPromise(nextPromise, returnValue, res, rej) {
if (returnValue instanceof MyPromise) { //返回值是一個Promise對象
returnValue.then(function(val) {
res(val) //給返回值是promise對象里面的成功的 下一個注冊then方法(外部調(diào)用)
}, function(reason) {
rej(reason) //給返回值是promise對象里面的失敗的 下一個注冊then方法(外部調(diào)用)
})
} else {
res(returnValue)
}
}
//原型上的then方法
MyPromise.prototype.then = function(onFulfilled, onRejected) {
var self = this;
//鏈?zhǔn)秸{(diào)用空then處理
if (!onFulfilled) { //如果then的成功處理函數(shù)不存在,即為空的then塞颁,直接return傳入的值
onFulfilled = function(val) {
return val
}
}
if (!onRejected) { //如果then的失敗處理函數(shù)不存在浦箱,即為空的then,如果有錯誤拋出來祠锣,則傳遞給下一個
onRejected = function(reason) {
throw new Error(reason)
}
}
var nextPromise = new MyPromise(function(res, rej) {
//進(jìn)行異步操作的時候這一塊的狀態(tài)還是pending酷窥,不會進(jìn)去的
if (self.state === 'fulfilled') {
setTimeout(function() { //沒有操作微任務(wù)的權(quán)限,則用setTimeout來模擬
try {
var nextResolveValue = onFulfilled(self.resolveValue);
// res(nextResolveValue);
ResolutionReturnPromise(nextPromise, nextResolveValue, res, rej) //解決所有類型的返回值
} catch (e) {
rej(e)
}
}, 0)
};
if (self.state === 'rejected') {
setTimeout(function() {
try {
var nextRejectValue = onRejected(self.rejectValue);
// res(nextRejectValue);
ResolutionReturnPromise(nextPromise, nextRejectValue, res, rej)
} catch (e) {
rej(e)
}
}, 0)
}
if (self.state === 'pending') {
setTimeout(function() {
try {
self.ResolveCallBackList.push(function() {
var nextResolveValue = onFulfilled(self.resolveValue);
// res(nextResolveValue);
ResolutionReturnPromise(nextPromise, nextResolveValue, res, rej)
})
} catch (e) {
rej(e)
}
}, 0);
setTimeout(function() {
try {
self.RejectCallBackList.push(function() {
var nextRejectValue = onRejected(self.rejectValue);
// res(nextRejectValue);
ResolutionReturnPromise(nextPromise, nextRejectValue, res, rej)
})
} catch (e) {
rej(e)
}
}, 0)
}
})
return nextPromise; //實(shí)現(xiàn)鏈?zhǔn)讲僮靼橥焉弦徊絫hen執(zhí)行完返回的一個新的promise給return出來
}
十二蓬推、class
class是一個類,他的數(shù)據(jù)類型是函數(shù)澡腾,本身就指向構(gòu)造函數(shù)沸伏,也需要用 new 關(guān)鍵字來使用
里面有原型方法、靜態(tài)方法动分、私有的屬性等毅糟,不存在變量提升
學(xué)習(xí) class 的時候要結(jié)合 js 的原型和原型鏈一起來學(xué)習(xí),類的所有實(shí)例共享一個原型對象
類的方法內(nèi)部有this默認(rèn)指向類的實(shí)例澜公,單獨(dú)使用方法會報(bào)錯
學(xué)習(xí)了解了 class 的取值函數(shù)和存執(zhí)函數(shù)姆另,函數(shù)名為變量時候要使用方括號
class 的繼承使用 extends 關(guān)鍵字
super 當(dāng)函數(shù)使用時候,代表父類的構(gòu)造函數(shù)玛瘸,子類構(gòu)造函數(shù)必須執(zhí)行一次 super 函數(shù)
super 雖然嗲表了父類的構(gòu)造函數(shù)蜕青,但是 this 指向子類
super 只能在子類的構(gòu)造函數(shù)中使用,在其他地方就會報(bào)錯
super 作為對象使用時候糊渊,在普通方法指向父類原型對象右核,在靜態(tài)方法指向父類
super 指向父類的原型對象,所以定義在父類實(shí)例上面的方法是不能通過 super 調(diào)用的
十二渺绒、Generator函數(shù)
是個生成器函數(shù)贺喝,相比于普通函數(shù),它在 function 關(guān)鍵字后面加了一個 * 號宗兼,內(nèi)部用的 yield 表達(dá)式
調(diào)用這個函數(shù)后躏鱼,返回的是一個遍歷器對象,則可以使用 next 方法殷绍,next 方法可以傳值
也可以使用 for...of 循環(huán)染苛,循環(huán) yield 表達(dá)是后面的值,不會遍歷出 return 的值
十三、async函數(shù)
async
就是Generator
函數(shù)的語法糖就是把
Generator
函數(shù)的星號替換成async
茶行,把yeild
替換成await
而已async
函數(shù)相對于Generator
函數(shù)的改進(jìn)提現(xiàn)在如下
- 內(nèi)置執(zhí)行器躯概,也就是說,
async
函數(shù)的執(zhí)行就跟普通函數(shù)一樣就行了 - 語義化更好畔师,
async
跟await
相比于yield
跟星號娶靡,更加語義化 - 廣泛的適用性,
await
侯敏可以使promise
對象也可以是原始類型的數(shù)值 - 返回值是
promise
看锉,比Generator
函數(shù)返回的Iterator
更加方便姿锭,可以用then
方法指定下一步的操作
- async有多種使用形式
//函數(shù)聲明
async function foo(){}
//函數(shù)表達(dá)式
const foo = async function (){}
//對象的方法
let obj = {async foo(){}}
obj.foo().then(.....)
//class的寫法
//箭頭函數(shù)
const foo = async()=>{};
async
函數(shù)返回一個Promise
對象內(nèi)部
return
返回出來的會成為then
方法回調(diào)函數(shù)的參數(shù)
async function f (){
return 'hello world';
}
f().then(v=>console.log(v));
//'hello world'
await命令正常情況下
await
后面返回的是一個promise對象,返回對象的結(jié)果伯铣,如果不是promise
對象呻此,則直接返回那個值await
后面的promise
對象要是變成rejecte
狀態(tài),則會被后面的catch
的回調(diào)函數(shù)接收到任何一個
await
后面的Promise
對象變?yōu)?code>reject狀態(tài)懂傀,那么整個async函數(shù)會中斷執(zhí)行
async function f() {
await Promise.reject('出錯了');
await Promise.resolve('hello world'); // 不會執(zhí)行
}
- 要是希望不會中斷函數(shù)執(zhí)行趾诗,則把它放在
try catch
里面,或者就是在await
后面的promise對象后面加一個catch
來捕獲錯誤,await
只能放在await
函數(shù)內(nèi)部,否則會報(bào)錯
十四蹬蚁、prox和reflect
簡單的了解了一下這部分
跟
Object.defineProperty
結(jié)合對比學(xué)習(xí)了一下