《ECMAScript 6 入門》 讀書筆記

一滋恬、let和const

  1. 這塊相對來說還是比較基礎(chǔ)的浅乔,有了解學(xué)習(xí)letconst定義變量的一些特點(diǎn):不能重復(fù)定義、不存在變量提升庶橱、const定義常量且需要給初始值等

  2. ES6的塊級作用域贮勃、暫時性死區(qū)等

二、變量的結(jié)構(gòu)賦值

按照ES6的一定模式苏章,可以從數(shù)組和對象中提取值,對變量進(jìn)行賦值奏瞬,這就是解構(gòu)

  1. 數(shù)組解構(gòu)
    let a = 1;  let b = 2;  let c = 3;
    
    let [a,b,c] = [1,2,3];
  1. 解構(gòu)不成功枫绅,則變量的值就是 undefined

  2. 解構(gòu)賦值允許指定默認(rèn)值

    let foo[foo = true] = [];
  1. 解構(gòu)不僅用于數(shù)組,還可以用于對象

  2. 對象的解構(gòu)賦值是先找到同名屬性硼端,然后再付給對應(yīng)的變量并淋,真正賦值的是后者,不是前者

三珍昨、模版字符串

  1. 普通字符串
    `In JavaScript '\n' is a line-feed.`
  1. 多行字符串
`In JavaScript this is
not legal.`
  1. 字符串中嵌入變量
    var name = "Bob", time = "today";
    `Hello ${name}, how are you ${time}?`;   
    // Hello Bob, how are you today?

四县耽、數(shù)值的擴(kuò)展

  1. 學(xué)習(xí)了一些API句喷,比如Number.isNaN()(判斷是不是數(shù)字)、Number.isFinite()(判斷是否有限)兔毙、Number.parseInt()(取整)唾琼、Number.isInteger()(判斷是不是整數(shù))等等

  2. 學(xué)習(xí)了Math對象的擴(kuò)展,比如Math.trunc()(去除小數(shù))澎剥、Math.sign()(判斷數(shù)值正負(fù))锡溯、Math.cbrt()(計(jì)算立方根)、Math.floor()(向下取整)等等

五哑姚、函數(shù)的擴(kuò)展

  1. 函數(shù)的參數(shù)可以指定默認(rèn)值

  2. 參數(shù)可以跟解構(gòu)賦值默認(rèn)值結(jié)合使用

  3. 默認(rèn)值的參數(shù)不是尾參數(shù)祭饭,無法只省略那個參數(shù)

  4. 函數(shù)含有length屬性,就是參數(shù)的個數(shù)叙量,如果有默認(rèn)值倡蝙,則長度減去默認(rèn)值個數(shù),rest參數(shù)也不會計(jì)入length屬性

  5. 函數(shù)的作用域绞佩、嚴(yán)格模式寺鸥、name屬性

  6. rest參數(shù)的形式為(...變量名),用來捕獲多函數(shù)多余的參數(shù)征炼,搭配的變量是一個數(shù)組析既,將多余的變量放到數(shù)組中

  7. 箭頭函數(shù)

    • 箭頭函數(shù)就是用()=> 定義函數(shù),一個參數(shù)不需要用括號谆奥,兩個或者多個就需要用圓括號把參數(shù)放里面
    • 箭頭函數(shù)可以省略return
    • 返回值是對象則需要在對象外面加一個圓括號
    • 可以跟架構(gòu)賦值結(jié)合使用
    • 不能new實(shí)例化眼坏,沒有prototype原型、沒有arguments對象
    • this指向最外層為非箭頭函數(shù)的那個對象
    • 不能使用yield命令酸些,則不能用作生成器函數(shù)
  8. 尾調(diào)優(yōu)化和函數(shù)參數(shù)的尾逗號

六宰译、數(shù)組的擴(kuò)展

  1. ...擴(kuò)展運(yùn)算符,好比rest參數(shù)的逆運(yùn)算
console.log(1,...[2,3,4,5]);
//1,2,3,4,5
  1. 可以用來合并數(shù)組魄懂,可以跟解構(gòu)賦值結(jié)合使用

  2. 可以把字符串穿換成數(shù)組

  3. 任何具有Iterator接口的對象都可以使用擴(kuò)展運(yùn)算符轉(zhuǎn)換為數(shù)組

  4. Array.from可以把一個類數(shù)組對象轉(zhuǎn)變?yōu)橐粋€真正的數(shù)組

  5. Array.of可以把一組值轉(zhuǎn)變?yōu)閿?shù)組

  6. 還學(xué)習(xí)了find沿侈、findIndexfill市栗、includes

  7. entries缀拭、keys等方法也學(xué)習(xí)了解了

七填帽、對象的擴(kuò)展

  1. 允許直接寫入變量和函數(shù)作為對象的屬性和方法蛛淋,用于函數(shù)的返回值

  2. Object.is方法判斷兩個值是不是嚴(yán)格相等

  3. Object.assign方法用于對象的合并,還可以實(shí)現(xiàn)一定程度的拷貝(不可枚舉的屬性不能拷貝篡腌,繼承屬性不能拷貝)

  4. 還學(xué)習(xí)了__proto__褐荷、Object.setPrototypeOf()Object.getPrototypeOf()嘹悼、Object.keys()叛甫、Object.values()层宫、Object.entriess()等一些API

八、Set和Map數(shù)據(jù)結(jié)構(gòu)

  1. Set 是一個構(gòu)造函數(shù)其监,可以用來生成Set數(shù)據(jù)結(jié)構(gòu)萌腿,Set 的成員是唯一的,則可以用來進(jìn)行數(shù)組的去重

  2. 學(xué)習(xí)到了 Set 身上的一些API棠赛,比如 add (添加)哮奇、size(長度)、delete(刪除)睛约、clear(清除)鼎俘、has(是否包含)等

  3. 數(shù)組的 map 和 filter 方法也是可以用在 Set 身上

  4. Map 本質(zhì)上是鍵值對的集合,它身上也是有很多的 API 辩涝,也進(jìn)行了學(xué)習(xí)了解

  5. 對一個鍵值進(jìn)行兩次賦值贸伐,則后面的會覆蓋前面的

    const map = new Map();
    
    map.set(1,'a').set(1,'b');
    
    map.get(1);  //'b'
  1. 可以進(jìn)行Map和數(shù)組、數(shù)組怔揩、JSON 之間的轉(zhuǎn)化

九捉邢、Iterator和for...of

  1. Iterator是個遍歷器,具有next方法商膊,調(diào)用一次伏伐,指針指向他內(nèi)部的下一個數(shù)據(jù)結(jié)構(gòu),不斷調(diào)用晕拆,直到結(jié)束

  2. 默認(rèn)的接口部署在數(shù)據(jù)結(jié)構(gòu)的Symbol.iterator屬性上藐翎,也就是說有這個屬性,那么就是可以遍歷的

  3. 擴(kuò)展運(yùn)算符(...)會默認(rèn)調(diào)用iterator接口

  4. 具有這個接口的就是可以遍歷的实幕,就可以使用 for...of 進(jìn)行遍歷

  5. for...of 可以獲得數(shù)組的鍵值吝镣,for...in 獲得鍵名(索引)

十、Symbol

  1. Symbol 是一種新的數(shù)據(jù)類型昆庇,表示獨(dú)一無二的值

  2. Symbol()末贾,無論括號里面有沒有參數(shù),這兩個值都不相等

  3. Symbol.for()整吆,括號里參數(shù)相同拱撵,則就是同一個值,就是相等的

  4. Symbol.keyfor(),則表示一個已經(jīng)登記的 Symbol 類型值的 key

十一表蝙、Promise

  1. promise是一種異步編程解決方案裕膀,里面有未來會結(jié)束的事件,有三種狀態(tài)勇哗,pending(進(jìn)行中)、fulfilled(成功)寸齐、rejected(失斢怠)

  2. promise 對象是一個構(gòu)造函數(shù)

var promise = new Promise(function(res,rej)){
    if(/異步操作成功/){
        resolve(val)
    }else{
        rej(reason)
    }
}
  1. promise實(shí)例生成后抄谐,可以用 then 方法來分別制定成功和失敗的回調(diào)函數(shù)

  2. then方法可以實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,可以將上一步結(jié)束的值作為參數(shù)傳給下一個 then

  3. promise.all()扰法、promise.race()也納入了學(xué)習(xí)內(nèi)容中

  4. 并嘗試結(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

  1. class是一個類,他的數(shù)據(jù)類型是函數(shù)澡腾,本身就指向構(gòu)造函數(shù)沸伏,也需要用 new 關(guān)鍵字來使用

  2. 里面有原型方法、靜態(tài)方法动分、私有的屬性等毅糟,不存在變量提升

  3. 學(xué)習(xí) class 的時候要結(jié)合 js 的原型和原型鏈一起來學(xué)習(xí),類的所有實(shí)例共享一個原型對象

  4. 類的方法內(nèi)部有this默認(rèn)指向類的實(shí)例澜公,單獨(dú)使用方法會報(bào)錯

  5. 學(xué)習(xí)了解了 class 的取值函數(shù)和存執(zhí)函數(shù)姆另,函數(shù)名為變量時候要使用方括號

  6. class 的繼承使用 extends 關(guān)鍵字

  7. super 當(dāng)函數(shù)使用時候,代表父類的構(gòu)造函數(shù)玛瘸,子類構(gòu)造函數(shù)必須執(zhí)行一次 super 函數(shù)

  8. super 雖然嗲表了父類的構(gòu)造函數(shù)蜕青,但是 this 指向子類

  9. super 只能在子類的構(gòu)造函數(shù)中使用,在其他地方就會報(bào)錯

  10. super 作為對象使用時候糊渊,在普通方法指向父類原型對象右核,在靜態(tài)方法指向父類

  11. super 指向父類的原型對象,所以定義在父類實(shí)例上面的方法是不能通過 super 調(diào)用的

十二渺绒、Generator函數(shù)

  1. 是個生成器函數(shù)贺喝,相比于普通函數(shù),它在 function 關(guān)鍵字后面加了一個 * 號宗兼,內(nèi)部用的 yield 表達(dá)式

  2. 調(diào)用這個函數(shù)后躏鱼,返回的是一個遍歷器對象,則可以使用 next 方法殷绍,next 方法可以傳值

  3. 也可以使用 for...of 循環(huán)染苛,循環(huán) yield 表達(dá)是后面的值,不會遍歷出 return 的值

十三、async函數(shù)

  1. async就是Generator函數(shù)的語法糖

  2. 就是把Generator函數(shù)的星號替換成async茶行,把yeild替換成await而已

  3. async函數(shù)相對于Generator函數(shù)的改進(jìn)提現(xiàn)在如下

  • 內(nèi)置執(zhí)行器躯概,也就是說,async函數(shù)的執(zhí)行就跟普通函數(shù)一樣就行了
  • 語義化更好畔师,asyncawait相比于yield跟星號娶靡,更加語義化
  • 廣泛的適用性, await侯敏可以使promise對象也可以是原始類型的數(shù)值
  • 返回值是promise看锉,比Generator函數(shù)返回的Iterator更加方便姿锭,可以用then方法指定下一步的操作
  1. async有多種使用形式
    //函數(shù)聲明
    async function foo(){}
    //函數(shù)表達(dá)式
    const foo = async function (){}
    //對象的方法
    let obj = {async foo(){}}
    obj.foo().then(.....)
    //class的寫法
    //箭頭函數(shù)
    const foo = async()=>{};
  1. async函數(shù)返回一個Promise對象

  2. 內(nèi)部return返回出來的會成為then方法回調(diào)函數(shù)的參數(shù)

    async function f (){
      return 'hello world';
    }
    f().then(v=>console.log(v));
    //'hello world'
  1. await命令正常情況下await后面返回的是一個promise對象,返回對象的結(jié)果伯铣,如果不是promise對象呻此,則直接返回那個值

  2. await后面的promise對象要是變成rejecte狀態(tài),則會被后面的catch的回調(diào)函數(shù)接收到

  3. 任何一個await后面的Promise對象變?yōu)?code>reject狀態(tài)懂傀,那么整個async函數(shù)會中斷執(zhí)行

    async function f() {
      await Promise.reject('出錯了');
      await Promise.resolve('hello world'); // 不會執(zhí)行
}
  1. 要是希望不會中斷函數(shù)執(zhí)行趾诗,則把它放在try catch里面,或者就是在await后面的promise對象后面加一個catch來捕獲錯誤,await只能放在await函數(shù)內(nèi)部,否則會報(bào)錯

十四蹬蚁、prox和reflect

  1. 簡單的了解了一下這部分

  2. Object.defineProperty結(jié)合對比學(xué)習(xí)了一下

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末恃泪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子犀斋,更是在濱河造成了極大的恐慌贝乎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叽粹,死亡現(xiàn)場離奇詭異览效,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虫几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門锤灿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辆脸,你說我怎么就攤上這事但校。” “怎么了啡氢?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵状囱,是天一觀的道長。 經(jīng)常有香客問我倘是,道長亭枷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任搀崭,我火速辦了婚禮叨粘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己宣鄙,他們只是感情好袍镀,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著冻晤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绸吸。 梳的紋絲不亂的頭發(fā)上鼻弧,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音锦茁,去河邊找鬼攘轩。 笑死,一個胖子當(dāng)著我的面吹牛码俩,可吹牛的內(nèi)容都是我干的度帮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼稿存,長吁一口氣:“原來是場噩夢啊……” “哼笨篷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瓣履,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤率翅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袖迎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冕臭,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年燕锥,在試婚紗的時候發(fā)現(xiàn)自己被綠了辜贵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡归形,死狀恐怖托慨,靈堂內(nèi)的尸體忽然破棺而出剖膳,到底是詐尸還是另有隱情梢为,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布裳朋,位于F島的核電站跺撼,受9級特大地震影響窟感,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歉井,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一柿祈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦躏嚎、人聲如沸蜜自。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽重荠。三九已至,卻和暖如春虚茶,著一層夾襖步出監(jiān)牢的瞬間戈鲁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工嘹叫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婆殿,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓罩扇,卻偏偏與公主長得像婆芦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子喂饥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354