2018W23 學(xué)習(xí)筆記

這周因為朋友結(jié)婚幫忙的緣故,學(xué)習(xí)的內(nèi)容明顯下降了不少瓶籽。所以,等明天開始埂材,得需要恢復(fù)之前每天學(xué)習(xí)的強度塑顺。

本周的學(xué)習(xí)共分為3塊:

  1. ES6基礎(chǔ)學(xué)習(xí)與深入;
  2. Vue源碼閱讀楞遏;
  3. 前端進(jìn)階班的預(yù)習(xí)茬暇;
    下面我們按照上面模塊一起去看一下本周我到底獲得了哪些收貨。

1.ES6學(xué)習(xí)

閱讀完成《深入理解ES6》的第三章寡喝。第三章主要講述的是函數(shù)的ES6新特性糙俗。
我們都知道ES6是ES5的加強與補充,是為了解決ES5中某些遺留問題而提出的新的解決方案或者加強预鬓,所以順著這個思路巧骚,我就去做了這樣的筆記。

1.1 ES6函數(shù)新特性

在ES6中格二,針對函數(shù)劈彪,補充了如下的一些特性:

  • 參數(shù)默認(rèn)值
  • 使用不具名函數(shù)
  • 函數(shù)構(gòu)造器增強
  • 擴展運算符
  • 函數(shù)的雙重用途
  • 塊級函數(shù)
  • 箭頭函數(shù)
  • 尾調(diào)用優(yōu)化
1.1.1 參數(shù)默認(rèn)值

傳統(tǒng)的ES5設(shè)置函數(shù)默認(rèn)值需要逐個對參數(shù)進(jìn)行設(shè)置,所以代碼量非常多顶猜,而且對于JS這種不限制函數(shù)參數(shù)的行為其擴展性也很差沧奴。所以ES6在ES5的基礎(chǔ)上增加了參數(shù)默認(rèn)值的特效,其語法如下:

    function demo(url, timeout = 2000 , fn = function()
        {console.log('do it')
    })

值得注意的是长窄,我們可以向參數(shù)傳遞Undefined值來使用默認(rèn)的參數(shù)值滔吠,以上面函數(shù)為例,

      demo('http://www.baidu.com',undefined,fn)

這樣就可以繼續(xù)使用第二個參數(shù)的默認(rèn)值了挠日。

初次之外疮绷,還涉及到了2個比較“冷門的問題”:

  1. ES6參數(shù)默認(rèn)值是如何影響argument對象;
  2. 參數(shù)默認(rèn)值的暫時性死區(qū)嚣潜;

1.1.2 使用不具名函數(shù)

ES5的不具名的arguments對象在實際使用過程中會有很多的限制冬骚。在書中,就通過underscorejs庫中Pick函數(shù)的講解來說出arguments的不足懂算。

  // 復(fù)制特定對象的特定屬性
  function pick(object) {
    let result = Object.create(null);
    // 從第二個參數(shù)開始處理
    for (let i = 1, len = arguments.length; i < len; i++) {
      result[arguments[i]] = object[arguments[i]];
  }
    return result;
  }

  1. 雖然該函數(shù)能處理多個函數(shù)只冻,但是在函數(shù)的表現(xiàn)上則完全看不出;
  2. 函數(shù)的第一個參數(shù)是選中的目標(biāo)對象计技,從第二個開始才是需要復(fù)制的屬性喜德。

因此ES6引入了剩余參數(shù)這個概念,使用剩余函數(shù)對上述函數(shù)進(jìn)行改寫酸役,則清晰和優(yōu)雅不少住诸。

  function pick(object, ...keys) {
    let result = Object.create(null);
    for (let i = 0, len = keys.length; i < len; i++) {
    result[keys[i]] = object[keys[i]];
    }
    return result;
}

通過引入剩余參數(shù),我們就可以知道函數(shù)可以處理多余的函數(shù)涣澡。并且這與包含所有參數(shù)的arguements不同贱呐,我們可以單獨對剩余函數(shù)進(jìn)行處理。當(dāng)然剩余函數(shù)也有剩余的不足入桂,主要有以下兩點:

  1. 剩余參數(shù)必須要放在最后面奄薇;
  2. 剩余參數(shù)放在setter函數(shù)中不可用,會報語法錯誤馁蒂。

1.1.3 函數(shù)構(gòu)造器

作者聲稱,函數(shù)默認(rèn)值加上剩余函數(shù)加強了函數(shù)構(gòu)造器的能力蜘腌,但是沫屡,在實際工作中,筆者覺得函數(shù)構(gòu)造器的用處并不多撮珠。


1.2.4 擴展運算符

剩余參數(shù)是將多個參數(shù)添加進(jìn)數(shù)組沮脖,而擴展運算符則是將數(shù)組的元素分成單個的元素,類似于split的功能芯急。它主要的目的是代替apply勺届。其使用場景如下:

   let values = [1,8,3];
  // ES5版本
  Math.max.apply(Math, values);

   // ES6版本
  Math.max(...values);

在之前的ES5版本中,要實現(xiàn)求一個數(shù)組的最大數(shù)娶耍,需要使用apply去更改上下文的執(zhí)行環(huán)境免姿,而有了擴展運算符之后,則輕松很多榕酒,并且從語義化角度上來說胚膊,也清晰不少。


1.1.4 函數(shù)的雙重用途

在ES5中奈应,函數(shù)是否調(diào)用new操作符則意味著不同的用途澜掩。沒有new操作符,它就是執(zhí)行函數(shù)體內(nèi)的代碼杖挣。而有了new肩榕,函數(shù)就會執(zhí)行內(nèi)部[[ constructor]]方法,構(gòu)建一個對象惩妇。所以這就是函數(shù)的雙重用途的意思株汉。
在ES5中,判斷函數(shù)是否調(diào)用了new操作歌殃,最簡單也是最流行的一種做法就是使用instanceof這個方法乔妈,但是,這個方法也有明顯的缺陷氓皱,開發(fā)者可以使用apply去改變函數(shù)執(zhí)行的上下文順序路召,從而使instanceof的執(zhí)行判斷出錯勃刨。

function Person(name) {
    if (this instanceof Person) {
        this.name = name; // 使用 new
      } else {
          throw new Error("You must use new with Person.")
      }
     }  
      var person = new Person("Nicholas");
      var notAPerson = Person.call(person, "Michael"); // 奏效了!

因此在ES6中引入了new.target來彌補相關(guān)不足股淡。

    function Person(name){
        if(typeof new.target != undefined){
            this.name =name;
        }else{
            throw new Error('must with new');
        }
    }

其底層原理是身隐,在調(diào)用new 操作符時,調(diào)用[[ constructor ]]方法唯灵,new.target才會生成贾铝,(否則為undefined)并且將this對象賦值為原構(gòu)造函數(shù)。


1.1.5 ES6箭頭函數(shù)

之前也學(xué)習(xí)過ES6箭頭函數(shù)埠帕,但是沒有想到的是垢揩,ES6函數(shù)為了增強ES5函數(shù)的一些不足,竟然和傳統(tǒng)的函數(shù)有很多不一樣的特點:

  1. 沒有this,super,arguments和new.target綁定敛瓷;
  2. 箭頭函數(shù)不能作為構(gòu)造函數(shù)叁巨,也就是說不能被new,也沒有prototype屬性呐籽;
  3. 不能更改this的指向(js深惡痛絕的this指向問題)俘种;
  4. 不能重復(fù)相同的參數(shù)命名。

這些特點是為了減少箭頭函數(shù)內(nèi)部的錯誤與不確定性绝淡,為了js函數(shù)更好的運行宙刘。


2. Vue源碼學(xué)習(xí)

主要是看了第500-900行的代碼,粗略地知道了Vue對數(shù)組的監(jiān)聽牢酵。

首先獲取數(shù)組的原型對象悬包,在這個對象上有數(shù)組的方法。

    var arrProto = Array.prototype;

然后使用Object.create的方法創(chuàng)建了一個空對象馍乙,其中它的原型鏈上有數(shù)組方法的集合布近。

    var arrMethods = Object.create(arrProto);

創(chuàng)建一個數(shù)組方法的集合:

    var methodsToPatch = [
            'push',
            'pop',
            'shift',
            'unshift',
            'splice',
            'sort',
            'reverse'
        ];

最關(guān)鍵的一步:對arrMethods進(jìn)行構(gòu)建:

給arrMethods添加屬性

  1. 遍歷methodsToPatch,在回調(diào)函數(shù)中調(diào)用def函數(shù)給arrMethods添加方法相對應(yīng)的屬性
    methodsToPatch.forEach(method => {
            def(arrMethods, method, function mutator() {
                // 相關(guān)代碼第二步進(jìn)行解析
            })
        });

    function def(obj, key, val, enumerable) {
            Object.defineProperty(obj, key, {
                value: val,
                enumerable: !!enumerable,
                writable: true,
                configurable: true
            });
        }?

  1. muator函數(shù)的定義
       function mutator() {
            //定義args容器丝格,并且獲取函數(shù)參數(shù)的長度
            var args = [],
                len = arguments.length;

            while (len--) args[len] = arguments[len]; //將類數(shù)組轉(zhuǎn)換成數(shù)組

            //這里的this指的就是arrMethods 調(diào)用arrMethods中的方法和參數(shù)
            var result = original.apply(this, args);

            //監(jiān)聽類 下面代碼就調(diào)用了它的notify和observeArray方法
            var ob = this.__ob__; 
            var inserted;

            //如果是push/unshift/splice方法 對inserted進(jìn)行賦值
            switch (method) {
                case 'push':
                case 'unshift':
                    inserted = args;
                    break;

                case 'splice':
                    inserted = args.splice(2);
                    break;
            }

            
            if (inserted) {
                ob.observeArray(inserted); //對傳入的參數(shù)進(jìn)行監(jiān)聽
            }

            ob.deep.notify(); //通知視圖發(fā)生變化

            return result;

        };  
    

3.課程進(jìn)階學(xué)習(xí)

這里總結(jié)性的語言就不寫了撑瞧,拋出問題,測試一下是否能回答出:

  • 有哪3種為DOM元素注冊事件處理函數(shù)的方式显蝌?分別有什么限制和優(yōu)點预伺?

  • Dom Event接口中哪些屬性和接口需要了解?

  • 如何自定義一個Event事件曼尊?請寫出一個demo;

  • JS事件的傳播是如何傳播的酬诀?

  • 簡述下面代碼的執(zhí)行順序

        // html 
        <div id='outter'>
            <p id='inner'> click </p>
        </div>

        // js
        
        let outter = document.getElementById('outter');
        let inner = document.getElementById('inner');
        
        outter.addEventListener('click', function () {
            console.log('outter-true')
        }, true);
        inner.addEventListener('click', function () {
            console.log('inner-true')
        }, true);
        inner.addEventListener('click', function () {
            console.log('inner-false')
        }, false);
        outter.addEventListener('click', function () {
            console.log('outter-false')
        }, false);

  • 請解釋一下什么是JS事件代理?

  • 請簡單地寫一下事件代理的demo;

  • 可以使用哪個事件來阻止事件的傳播骆撇?

  • util.callbackify這個API的作用是什么瞒御?

  • 回調(diào)函數(shù)中的第一個參數(shù)和第二個參數(shù)分別是什么?

  • 請寫出API的具體使用方法:將一個異步函數(shù)轉(zhuǎn)換為錯誤回調(diào)優(yōu)先的函數(shù)

  • 回調(diào)函數(shù)中的 null 有什么意義么神郊?

  • 回調(diào)函數(shù)中的錯誤原因可以通過什么屬性獲入热埂趾唱?

  • generator對象是什么?怎樣才能獲取到蜻懦?

  • 請寫出generator最基本的語法;

  • 調(diào)用一個生成器函數(shù)會立即執(zhí)行函數(shù)體里面的語句么鲸匿?

  • 發(fā)布/訂閱模式和觀察者的區(qū)別是什么?


梳理完本周學(xué)習(xí)的內(nèi)容阻肩,發(fā)現(xiàn)有很多都已經(jīng)忘了,不多說了运授,需要趕緊去復(fù)習(xí)烤惊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吁朦,隨后出現(xiàn)的幾起案子柒室,更是在濱河造成了極大的恐慌,老刑警劉巖逗宜,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雄右,死亡現(xiàn)場離奇詭異,居然都是意外死亡纺讲,警方通過查閱死者的電腦和手機擂仍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熬甚,“玉大人逢渔,你說我怎么就攤上這事∠缋ǎ” “怎么了肃廓?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诲泌。 經(jīng)常有香客問我盲赊,道長,這世上最難降的妖魔是什么敷扫? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任哀蘑,我火速辦了婚禮,結(jié)果婚禮上葵第,老公的妹妹穿的比我還像新娘递礼。我一直安慰自己,他們只是感情好羹幸,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布脊髓。 她就那樣靜靜地躺著,像睡著了一般栅受。 火紅的嫁衣襯著肌膚如雪将硝。 梳的紋絲不亂的頭發(fā)上恭朗,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音依疼,去河邊找鬼痰腮。 笑死,一個胖子當(dāng)著我的面吹牛律罢,可吹牛的內(nèi)容都是我干的膀值。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼误辑,長吁一口氣:“原來是場噩夢啊……” “哼沧踏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巾钉,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤翘狱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后砰苍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潦匈,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年赚导,在試婚紗的時候發(fā)現(xiàn)自己被綠了茬缩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吼旧,死狀恐怖寒屯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黍少,我是刑警寧澤寡夹,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站厂置,受9級特大地震影響菩掏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昵济,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一智绸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧访忿,春花似錦瞧栗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卧斟,卻和暖如春殴边,著一層夾襖步出監(jiān)牢的瞬間憎茂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工锤岸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竖幔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓是偷,卻偏偏與公主長得像拳氢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛋铆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)馋评,也就是一...
    悟名先生閱讀 4,149評論 0 13
  • 三,字符串?dāng)U展 3.1 Unicode表示法 ES6 做出了改進(jìn)戒职,只要將碼點放入大括號,就能正確解讀該字符透乾。有了這...
    eastbaby閱讀 1,536評論 0 8
  • 函數(shù)和對象 1洪燥、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句乳乌,而且...
    道無虛閱讀 4,564評論 0 5
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,128評論 0 21
  • 你可能覺得捧韵,“戰(zhàn)略”這個詞你已經(jīng)非常熟悉了,很多地方都聽過無數(shù)次汉操。但是再来,在很多情況下我們對”戰(zhàn)略“這個詞的理解是很...
    余子祥閱讀 285評論 0 1