1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        爆肝22個ES6知識點

        共 13185字,需瀏覽 27分鐘

         ·

        2022-08-02 07:35

        近期在復(fù)習(xí)ES6,針對ES6新的知識點,以問答形式整理一個全面知識和問題匯總。


        一、問:ES6是什么,為什么要學(xué)習(xí)它,不學(xué)習(xí)ES6會怎么樣?

        答:ES6是新一代的JS語言標(biāo)準(zhǔn),對分JS語言核心內(nèi)容做了升級優(yōu)化,規(guī)范了JS使用標(biāo)準(zhǔn),新增了JS原生方法,使得JS使用更加規(guī)范,更加優(yōu)雅,更適合大型應(yīng)用的開發(fā)。學(xué)習(xí)ES6是成為專業(yè)前端正規(guī)軍的必經(jīng)之路。不學(xué)習(xí)ES6也可以寫代碼打鬼子,但是最多只能當(dāng)個游擊隊長。

        二、問:ES5、ES6和ES2015有什么區(qū)別?

        答:ES2015特指在2015年發(fā)布的新一代JS語言標(biāo)準(zhǔn),ES6泛指下一代JS語言標(biāo)準(zhǔn),包含ES2015、ES2016、ES2017、ES2018等。現(xiàn)階段在絕大部分場景下,ES2015默認(rèn)等同ES6。ES5泛指上一代語言標(biāo)準(zhǔn)。ES2015可以理解為ES5和ES6的時間分界線。

        三、問:babel是什么,有什么作用?

        答:babel是一個 ES6 轉(zhuǎn)碼器,可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼,以便兼容那些還沒支持ES6的平臺。

        四、問:let有什么用,有了var為什么還要用let?

        答:在ES6之前,聲明變量只能用var,var方式聲明變量其實是很不合理的,準(zhǔn)確的說,是因為ES5里面沒有塊級作用域是很不合理的,甚至可以說是一個語言層面的bug(這也是很多c++、java開發(fā)人員看不懂,也瞧不起JS語言的劣勢之一)。沒有塊級作用域會帶來很多難以理解的問題,比如for循環(huán)var變量泄露,變量覆蓋等問題。let 聲明的變量擁有自己的塊級作用域,且修復(fù)了var聲明變量帶來的變量提升問題。

        五、問:舉一些ES6對String字符串類型做的常用升級優(yōu)化?

        答:

        1、優(yōu)化部分:

        ES6新增了字符串模板,在拼接大段字符串時,用反斜杠(`)取代以往的字符串相加的形式,能保留所有空格和換行,使得字符串拼接看起來更加直觀,更加優(yōu)雅。

        2、升級部分:

        ES6在String原型上新增了includes()方法,用于取代傳統(tǒng)的只能用indexOf查找包含字符的方法(indexOf返回-1表示沒查到不如includes方法返回false更明確,語義更清晰), 此外還新增了startsWith(), endsWith(), padStart(),padEnd(),repeat()等方法,可方便的用于查找,補全字符串。

        六、問:舉一些ES6對Array數(shù)組類型做的常用升級優(yōu)化?

        答:

        1、優(yōu)化部分:

        a. 數(shù)組解構(gòu)賦值。ES6可以直接以let [a,b,c] = [1,2,3]形式進(jìn)行變量賦值,在聲明較多變量時,不用再寫很多l(xiāng)et(var),且映射關(guān)系清晰,且支持賦默認(rèn)值。

        b. 擴(kuò)展運算符。ES6新增的擴(kuò)展運算符(...)(重要),可以輕松的實現(xiàn)數(shù)組和松散序列的相互轉(zhuǎn)化,可以取代arguments對象和apply方法,輕松獲取未知參數(shù)個數(shù)情況下的參數(shù)集合。(尤其是在ES5中,arguments并不是一個真正的數(shù)組,而是一個類數(shù)組的對象,但是擴(kuò)展運算符的逆運算卻可以返回一個真正的數(shù)組)。擴(kuò)展運算符還可以輕松方便的實現(xiàn)數(shù)組的復(fù)制和解構(gòu)賦值(let a = [2,3,4]; let b = [...a])。

        2、升級部分:

        ES6在Array原型上新增了find()方法,用于取代傳統(tǒng)的只能用indexOf查找包含數(shù)組項目的方法,且修復(fù)了indexOf查找不到NaN的bug([NaN].indexOf(NaN) === -1).此外還新增了copyWithin(), includes(), fill(),flat()等方法,可方便的用于字符串的查找,補全,轉(zhuǎn)換等。

        七、問:舉一些ES6對Number數(shù)字類型做的常用升級優(yōu)化?

        答:

        1、優(yōu)化部分:

        ES6在Number原型上新增了isFinite(), isNaN()方法,用來取代傳統(tǒng)的全局isFinite(), isNaN()方法檢測數(shù)值是否有限、是否是NaN。ES5的isFinite(), isNaN()方法都會先將非數(shù)值類型的參數(shù)轉(zhuǎn)化為Number類型再做判斷,這其實是不合理的,最造成isNaN('NaN') === true的奇怪行為--'NaN'是一個字符串,但是isNaN卻說這就是NaN。而Number.isFinite()和Number.isNaN()則不會有此類問題(Number.isNaN('NaN') === false)。(isFinite()同上)

        2、升級部分:

        ES6在Math對象上新增了Math.cbrt(),trunc(),hypot()等等較多的科學(xué)計數(shù)法運算方法,可以更加全面的進(jìn)行立方根、求和立方根等等科學(xué)計算。

        八、問:舉一些ES6對Object類型做的常用升級優(yōu)化?(重要)

        答:

        1、優(yōu)化部分:

        a. 對象屬性變量式聲明。ES6可以直接以變量形式聲明對象屬性或者方法,。比傳統(tǒng)的鍵值對形式聲明更加簡潔,更加方便,語義更加清晰。

        let [apple, orange] = ['red appe''yellow orange'];
        let myFruits = {apple, orange};    // let myFruits = {apple: 'red appe', orange: 'yellow orange'};

        尤其在對象解構(gòu)賦值(見優(yōu)化部分b.)或者模塊輸出變量時,這種寫法的好處體現(xiàn)的最為明顯:

        let {keys, values, entries} = Object;
        let MyOwnMethods = {keys, values, entries}; // let MyOwnMethods = {keys: keys, values: values, entries: entries}

        可以看到屬性變量式聲明屬性看起來更加簡潔明了。方法也可以采用簡潔寫法:

        let es5Fun = {
            method: function(){}
        }; 
        let es6Fun = {
            method(){}
        }

        b. 對象的解構(gòu)賦值。ES6對象也可以像數(shù)組解構(gòu)賦值那樣,進(jìn)行變量的解構(gòu)賦值:

        let {apple, orange} = {apple: 'red appe', orange: 'yellow orange'};

        c. 對象的擴(kuò)展運算符(...)。ES6對象的擴(kuò)展運算符和數(shù)組擴(kuò)展運算符用法本質(zhì)上差別不大,畢竟數(shù)組也就是特殊的對象。對象的擴(kuò)展運算符一個最常用也最好用的用處就在于可以輕松的取出一個目標(biāo)對象內(nèi)部全部或者部分的可遍歷屬性,從而進(jìn)行對象的合并和分解。

        let {apple, orange, ...otherFruits} = {apple: 'red apple', orange: 'yellow orange', grape: 'purple grape', peach: 'sweet peach'}; 
        // otherFruits  {grape: 'purple grape', peach: 'sweet peach'}
        // 注意: 對象的擴(kuò)展運算符用在解構(gòu)賦值時,擴(kuò)展運算符只能用在最后一個參數(shù)(otherFruits后面不能再跟其他參數(shù))
        let moreFruits = {watermelon: 'nice watermelon'};
        let allFruits = {apple, orange, ...otherFruits, ...moreFruits};

        d. super 關(guān)鍵字。ES6在Class類里新增了類似this的關(guān)鍵字super。同this總是指向當(dāng)前函數(shù)所在的對象不同,super關(guān)鍵字總是指向當(dāng)前函數(shù)所在對象的原型對象。

        2、升級部分:

        a. ES6在Object原型上新增了is()方法,做兩個目標(biāo)對象的相等比較,用來完善'==='方法。'==='方法中NaN === NaN //false其實是不合理的,Object.is修復(fù)了這個小bug。(Object.is(NaN, NaN) // true)

        b. ES6在Object原型上新增了assign()方法,用于對象新增屬性或者多個對象合并。

        const target = { a: 1 };
        const source1 = { b: 2 };
        const source2 = { c: 3 };
        Object.assign(target, source1, source2);
        target // {a:1, b:2, c:3}

        注意: assign合并的對象target只能合并source1、source2中的自身屬性,并不會合并source1、source2中的繼承屬性,也不會合并不可枚舉的屬性,且無法正確復(fù)制get和set屬性(會直接執(zhí)行g(shù)et/set函數(shù),取return的值)。

        c. ES6在Object原型上新增了getOwnPropertyDescriptors()方法,此方法增強了ES5中g(shù)etOwnPropertyDescriptor()方法,可以獲取指定對象所有自身屬性的描述對象。結(jié)合defineProperties()方法,可以完美復(fù)制對象,包括復(fù)制get和set屬性。

        d. ES6在Object原型上新增了getPrototypeOf()和setPrototypeOf()方法,用來獲取或設(shè)置當(dāng)前對象的prototype對象。這個方法存在的意義在于,ES5中獲取設(shè)置prototype對像是通過__proto__屬性來實現(xiàn)的,然而__proto__屬性并不是ES規(guī)范中的明文規(guī)定的屬性,只是瀏覽器各大產(chǎn)商“私自”加上去的屬性,只不過因為適用范圍廣而被默認(rèn)使用了,再非瀏覽器環(huán)境中并不一定就可以使用,所以為了穩(wěn)妥起見,獲取或設(shè)置當(dāng)前對象的prototype對象時,都應(yīng)該采用ES6新增的標(biāo)準(zhǔn)用法。

        e. ES6在Object原型上還新增了Object.keys(),Object.values(),Object.entries()方法,用來獲取對象的所有鍵、所有值和所有鍵值對數(shù)組。

        九、問:舉一些ES6對Function函數(shù)類型做的常用升級優(yōu)化?(重要)

        答:

        1、優(yōu)化部分:

        a. 箭頭函數(shù)**(核心)**。箭頭函數(shù)是ES6核心的升級項之一,箭頭函數(shù)里沒有自己的this,這改變了以往JS函數(shù)中最讓人難以理解的this運行機(jī)制。主要優(yōu)化點:

        Ⅰ.    箭頭函數(shù)內(nèi)的this指向的是函數(shù)定義時所在的對象,而不是函數(shù)執(zhí)行時所在的對象。ES5函數(shù)里的this總是指向函數(shù)執(zhí)行時所在的對象,這使得在很多情況下this的指向變得很難理解,尤其是非嚴(yán)格模式情況下,this有時候會指向全局對象,這甚至也可以歸結(jié)為語言層面的bug之一。ES6的箭頭函數(shù)優(yōu)化了這一點,它的內(nèi)部沒有自己的this,這也就導(dǎo)致了this總是指向上一層的this,如果上一層還是箭頭函數(shù),則繼續(xù)向上指,直到指向到有自己this的函數(shù)為止,并作為自己的this。

        Ⅱ.    箭頭函數(shù)不能用作構(gòu)造函數(shù),因為它沒有自己的this,無法實例化。

        Ⅲ.   也是因為箭頭函數(shù)沒有自己的this,所以箭頭函數(shù) 內(nèi)也不存在arguments對象。(可以用擴(kuò)展運算符代替)

        b. 函數(shù)默認(rèn)賦值。ES6之前,函數(shù)的形參是無法給默認(rèn)值得,只能在函數(shù)內(nèi)部通過變通方法實現(xiàn)。ES6以更簡潔更明確的方式進(jìn)行函數(shù)默認(rèn)賦值。

        function es6Fuc (x, y = 'default') {
            console.log(x, y);
        }
        es6Fuc(4) // 4, default

        2、升級部分:

        ES6新增了雙冒號運算符,用來取代以往的bind,call,和apply。(瀏覽器暫不支持,Babel已經(jīng)支持轉(zhuǎn)碼)

        foo::bar;
        // 等同于
        bar.bind(foo);

        foo::bar(...arguments);
        // 等同于
        bar.apply(foo, arguments);
        復(fù)制代碼

        十、問:Symbol是什么,有什么作用?

        答:Symbol是ES6引入的第七種原始數(shù)據(jù)類型(說法不準(zhǔn)確,應(yīng)該是第七種數(shù)據(jù)類型,Object不是原始數(shù)據(jù)類型之一,已更正),所有Symbol()生成的值都是獨一無二的,可以從根本上解決對象屬性太多導(dǎo)致屬性名沖突覆蓋的問題。對象中Symbol()屬性不能被for...in遍歷,但是也不是私有屬性。

        十一、問:Set是什么,有什么作用?

        答:Set是ES6引入的一種類似Array的新的數(shù)據(jù)結(jié)構(gòu),Set實例的成員類似于數(shù)組item成員,區(qū)別是Set實例的成員都是唯一,不重復(fù)的。這個特性可以輕松地實現(xiàn)數(shù)組去重。

        十二、問:Map是什么,有什么作用?

        答:Map是ES6引入的一種類似Object的新的數(shù)據(jù)結(jié)構(gòu),Map可以理解為是Object的超集,打破了以傳統(tǒng)鍵值對形式定義對象,對象的key不再局限于字符串,也可以是Object??梢愿尤娴拿枋鰧ο蟮膶傩?。微信搜索公眾號:Linux技術(shù)迷,回復(fù):linux 領(lǐng)取資料 。

        十三、問:Proxy是什么,有什么作用?

        答:Proxy是ES6新增的一個構(gòu)造函數(shù),可以理解為JS語言的一個代理,用來改變JS默認(rèn)的一些語言行為,包括攔截默認(rèn)的get/set等底層方法,使得JS的使用自由度更高,可以最大限度的滿足開發(fā)者的需求。比如通過攔截對象的get/set方法,可以輕松地定制自己想要的key或者value。下面的例子可以看到,隨便定義一個myOwnObj的key,都可以變成自己想要的函數(shù)。

        function createMyOwnObj() {
         //想把所有的key都變成函數(shù),或者Promise,或者anything
         return new Proxy({}, {
          get(target, propKey, receiver) {
           return new Promise((resolve, reject) => {
            setTimeout(() => {
             let randomBoolean = Math.random() > 0.5;
             let Message;
             if (randomBoolean) {
              Message = `你的${propKey}運氣不錯,成功了`;
              resolve(Message);
             } else {
              Message = `你的${propKey}運氣不行,失敗了`;
              reject(Message);
             }
            }, 1000);
           });
          }
         });
        }

        let myOwnObj = createMyOwnObj();

        myOwnObj.hahaha.then(result => {
         console.log(result) //你的hahaha運氣不錯,成功了
        }).catch(error => {
         console.log(error) //你的hahaha運氣不行,失敗了
        })

        myOwnObj.wuwuwu.then(result => {
         console.log(result) //你的wuwuwu運氣不錯,成功了
        }).catch(error => {
         console.log(error) //你的wuwuwu運氣不行,失敗了
        })

        十四、問:Reflect是什么,有什么作用?

        答:Reflect是ES6引入的一個新的對象,他的主要作用有兩點,一是將原生的一些零散分布在Object、Function或者全局函數(shù)里的方法(如apply、delete、get、set等等),統(tǒng)一整合到Reflect上,這樣可以更加方便更加統(tǒng)一的管理一些原生API。其次就是因為Proxy可以改寫默認(rèn)的原生API,如果一旦原生API別改寫可能就找不到了,所以Reflect也可以起到備份原生API的作用,使得即使原生API被改寫了之后,也可以在被改寫之后的API用上默認(rèn)的API。

        十五、問:Promise是什么,有什么作用?

        答:Promise是ES6引入的一個新的對象,他的主要作用是用來解決JS異步機(jī)制里,回調(diào)機(jī)制產(chǎn)生的“回調(diào)地獄”。它并不是什么突破性的API,只是封裝了異步回調(diào)形式,使得異步回調(diào)可以寫的更加優(yōu)雅,可讀性更高,而且可以鏈?zhǔn)秸{(diào)用。

        附錄:15道ES6 Promise實戰(zhàn)練習(xí)題

        十六、問:Iterator是什么,有什么作用?(重要)

        答:Iterator是ES6中一個很重要概念,它并不是對象,也不是任何一種數(shù)據(jù)類型。因為ES6新增了Set、Map類型,他們和Array、Object類型很像,Array、Object都是可以遍歷的,但是Set、Map都不能用for循環(huán)遍歷,解決這個問題有兩種方案,一種是為Set、Map單獨新增一個用來遍歷的API,另一種是為Set、Map、Array、Object新增一個統(tǒng)一的遍歷API,顯然,第二種更好,ES6也就順其自然的需要一種設(shè)計標(biāo)準(zhǔn),來統(tǒng)一所有可遍歷類型的遍歷方式。Iterator正是這樣一種標(biāo)準(zhǔn)?;蛘哒f是一種規(guī)范理念。

        就好像JavaScript是ECMAScript標(biāo)準(zhǔn)的一種具體實現(xiàn)一樣,Iterator標(biāo)準(zhǔn)的具體實現(xiàn)是Iterator遍歷器。Iterator標(biāo)準(zhǔn)規(guī)定,所有部署了key值為[Symbol.iterator],且[Symbol.iterator]的value是標(biāo)準(zhǔn)的Iterator接口函數(shù)(標(biāo)準(zhǔn)的Iterator接口函數(shù): 該函數(shù)必須返回一個對象,且對象中包含next方法,且執(zhí)行next()能返回包含value/done屬性的Iterator對象)的對象,都稱之為可遍歷對象,next()后返回的Iterator對象也就是Iterator遍歷器。

        //obj就是可遍歷的,因為它遵循了Iterator標(biāo)準(zhǔn),且包含[Symbol.iterator]方法,方法函數(shù)也符合標(biāo)準(zhǔn)的Iterator接口規(guī)范。
        //obj.[Symbol.iterator]() 就是Iterator遍歷器
        let obj = {
          data: [ 'hello''world' ],
          [Symbol.iterator]() {
            const self = this;
            let index = 0;
            return {
              next() {
                if (index < self.data.length) {
                  return {
                    value: self.data[index++],
                    donefalse
                  };
                } else {
                  return { value: undefined, donetrue };
                }
              }
            };
          }
        };

        ES6給Set、Map、Array、String都加上了[Symbol.iterator]方法,且[Symbol.iterator]方法函數(shù)也符合標(biāo)準(zhǔn)的Iterator接口規(guī)范,所以Set、Map、Array、String默認(rèn)都是可以遍歷的。

        //Array
        let array = ['red''green''blue'];
        array[Symbol.iterator]() //Iterator遍歷器
        array[Symbol.iterator]().next() //{value: "red"donefalse}

        //String
        let string = '1122334455';
        string[Symbol.iterator]() //Iterator遍歷器
        string[Symbol.iterator]().next() //{value: "1"donefalse}

        //set
        let set = new Set(['red''green''blue']);
        set[Symbol.iterator]() //Iterator遍歷器
        set[Symbol.iterator]().next() //{value: "red"donefalse}

        //Map
        let map = new Map();
        let obj= {map: 'map'};
        map.set(obj, 'mapValue');
        map[Symbol.iterator]().next()  {value: Array(2), donefalse}

        十七、問:for...in 和for...of有什么區(qū)別?

        答:如果看到問題十六,那么就很好回答。問題十六提到了ES6統(tǒng)一了遍歷標(biāo)準(zhǔn),制定了可遍歷對象,那么用什么方法去遍歷呢?答案就是用for...of。ES6規(guī)定,有所部署了載了Iterator接口的對象(可遍歷對象)都可以通過for...of去遍歷,而for..in僅僅可以遍歷對象。

        這也就意味著,數(shù)組也可以用for...of遍歷,這極大地方便了數(shù)組的取值,且避免了很多程序用for..in去遍歷數(shù)組的惡習(xí)。

        上面提到的擴(kuò)展運算符本質(zhì)上也就是for..of循環(huán)的一種實現(xiàn)。

        十八、Generator函數(shù)是什么,有什么作用?

        答:如果說JavaScript是ECMAScript標(biāo)準(zhǔn)的一種具體實現(xiàn)、Iterator遍歷器是Iterator的具體實現(xiàn),那么Generator函數(shù)可以說是Iterator接口的具體實現(xiàn)方式。

        執(zhí)行Generator函數(shù)會返回一個遍歷器對象,每一次Generator函數(shù)里面的yield都相當(dāng)一次遍歷器對象的next()方法,并且可以通過next(value)方法傳入自定義的value,來改變Generator函數(shù)的行為。

        Generator函數(shù)可以通過配合Thunk 函數(shù)更輕松更優(yōu)雅的實現(xiàn)異步編程和控制流管理。

        十九、async函數(shù)是什么,有什么作用?

        答:async函數(shù)可以理解為內(nèi)置自動執(zhí)行器的Generator函數(shù)語法糖,它配合ES6的Promise近乎完美的實現(xiàn)了異步編程解決方案。

        附錄:手寫async await的最簡實現(xiàn)(20行搞定)!阿里字節(jié)面試必考

        二十、Class、extends是什么,有什么作用?

        答:ES6 的class可以看作只是一個ES5生成實例對象的構(gòu)造函數(shù)的語法糖。它參考了java語言,定義了一個類的概念,讓對象原型寫法更加清晰,對象實例化更像是一種面向?qū)ο缶幊?。Class類可以通過extends實現(xiàn)繼承。它和ES5構(gòu)造函數(shù)的不同點:

        a. 類的內(nèi)部定義的所有方法,都是不可枚舉的。

        ///ES5
        function ES5Fun (x, y) {
         this.x = x;
         this.y = y;
        }
        ES5Fun.prototype.toString = function () {
          return '(' + this.x + ', ' + this.y + ')';
        }
        var p = new ES5Fun(1, 3);
        p.toString();
        Object.keys(ES5Fun.prototype); //['toString']

        //ES6
        class ES6Fun {
         constructor (x, y) {
          this.x = x;
          this.y = y;
         }
         toString () {
          return '(' + this.x + ', ' + this.y + ')';
         }
        }

        Object.keys(ES6Fun.prototype); //[]

        b.ES6的class類必須用new命令操作,而ES5的構(gòu)造函數(shù)不用new也可以執(zhí)行。

        c.ES6的class類不存在變量提升,必須先定義class之后才能實例化,不像ES5中可以將構(gòu)造函數(shù)寫在實例化之后。

        d.ES5 的繼承,實質(zhì)是先創(chuàng)造子類的實例對象this,然后再將父類的方法添加到this上面。ES6 的繼承機(jī)制完全不同,實質(zhì)是先將父類實例對象的屬性和方法,加到this上面(所以必須先調(diào)用super方法),然后再用子類的構(gòu)造函數(shù)修改this。

        二十一、module、export、import是什么,有什么作用?

        答:module、export、import是ES6用來統(tǒng)一前端模塊化方案的設(shè)計思路和實現(xiàn)方案。export、import的出現(xiàn)統(tǒng)一了前端模塊化的實現(xiàn)方案,整合規(guī)范了瀏覽器/服務(wù)端的模塊化方法,用來取代傳統(tǒng)的AMD/CMD、requireJS、seaJS、commondJS等等一系列前端模塊不同的實現(xiàn)方案,使前端模塊化更加統(tǒng)一規(guī)范,JS也能更加能實現(xiàn)大型的應(yīng)用程序開發(fā)。

        import引入的模塊是靜態(tài)加載(編譯階段加載)而不是動態(tài)加載(運行時加載)。

        import引入export導(dǎo)出的接口值是動態(tài)綁定關(guān)系,即通過該接口,可以取到模塊內(nèi)部實時的值。

        二十二、日常前端代碼開發(fā)中,有哪些值得用ES6去改進(jìn)的編程優(yōu)化或者規(guī)范?

        答:

        1. 常用箭頭函數(shù)來取代var self = this;的做法。
        2. 常用let取代var命令。
        3. 常用數(shù)組/對象的結(jié)構(gòu)賦值來命名變量,結(jié)構(gòu)更清晰,語義更明確,可讀性更好。
        4. 在長字符串多變量組合場合,用模板字符串來取代字符串累加,能取得更好地效果和閱讀體驗。
        5. 用Class類取代傳統(tǒng)的構(gòu)造函數(shù),來生成實例化對象。
        6. 在大型應(yīng)用開發(fā)中,要保持module模塊化開發(fā)思維,分清模塊之間的關(guān)系,常用import、export方法。

        作者:StevenLikeWatermelon
        https://juejin.cn/post/6844903734464495623


        The End

        瀏覽 46
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            九九re精品视频在线观看| 嫩BBB揍BBB揍BBB| 久热九九| 俺也去官网| 性猛交AAAA片免费观看直播| 亚洲欧美国产另类| 亚洲一区中文字幕成人在线| 欧美日日日| 日韩福利在线观看| 高H视频在线观看| 成人做爰100片免费观看视频| 人人妻人人玩人人澡人人爽| 日本亚洲中文字幕| 欧美成a| 国产成人三级片在线观看| 午夜大黄片| 成人三级AV在线| 免费性爱视频| 91精品国产综合久久久不打电影| 久草综合视频| ww国产| 91精品久久久久久粉嫩| 无码国产一区二区三区四区五区 | 三级片无码在线观看| 69av在线视频| 国产探花| 精品无码一区二区Av蜜桃| 亚洲狼人综合网| 嫩BBB搡BBBB搡BBBB-百度| 亚洲电影免费观看| 欧美黄片无码| 中文字幕日韩欧美在线| 亚洲无码激情在线| 大色欧美综合| 68久久久| 国产精品乱伦| 操逼视频网| 午夜天堂| 伊人大香蕉在线视频| 日本天堂网| 岛国免费av| 成人色色网| 欧美日韩性爱| 日韩欧美中文| 国产黄色视频免费| 国产成人无码区亚洲A片356p | 日韩在线高清视频| 日韩精彩视频| 亚洲wwwwww| 91精品国产闺蜜国产在线闺蜜| 天天天天毛片| 亚洲AV无码第一区二区三区蜜桃| mm131亚洲国产精品久久| 天天干天天日天天操| 天天肏| 国产激情久久| 人妻一区二区三区| 无码人妻一区二区三区免费九色| 日韩无码视频一区| 日本免费爱爱视频| 久久密| 最近中文字幕免费MV第一季歌词十 | 成人无码日韩| 日韩欧美二区| 亚洲AV无码免费| 日韩久久免费视频| 国产成人午夜福利在线| 免费a视频在线观看| 中文字幕黄色电影| 欧美一级黃色A片免费看小优视频 无码人妻精品一区二区三千菊电影 | 青青草原国产视频| 亚洲熟妇AV日韩熟妇在线| 日韩欧美在线一区| 四房五月婷婷| 美女网站黄色| 在线看片av| 国产成人自拍视频在线观看| 蝌蚪窝免费视频| h亚洲| 色老板在线免费观看| 精品无码三级在线观看视频| 成人v| 亚洲操操| 激情黄色视频| 亚洲小视频在线| V天堂在线| 国产在线黄片| 成人性爱网站| 91在线无码精品秘国产色多多| 国产免费A片| 一道本在线| 国内操B电影| 亚洲AVA| 黑人Av在线| 亚洲日韩一区二区三区| 最好看2019中文在线播放电影 | 欧美,日韩,中文字幕| 天堂无吗| 国产欧美一区二区三区特黄手机版| 婷婷V亚洲V丁香月天V日韩V| 91在线视频免费播放| 91理论片| 亚洲天堂影音先锋| 黄色永久网站| 69xx视频| 色婷婷综合激情| 亚洲无码影片| AV一级片| 日韩视频免费在线观看| 欧美成人精品一区二区| 台湾省成人网站| 免费的黄色录像| 黄色一级生活片| 国产欧美第一页| 少妇人妻在线| 91乱| 亚洲天堂手机在线| 黄页网址在线观看| 九一九色国产| 欧美日韩国产高清| 国产成人三级| 中文字幕永久在线| 狠狠躁日日躁夜夜躁A片视频| 老司机午夜电影| 青青成人视频| 人与禽一级A片一区二区三区| 亚洲黄色毛片| 三级片日韩| 日韩欧美高清第一期| 另类图片亚洲色图| 操比视频| 女人卖婬视频播放| 亚洲久久色| 日本有码中文字幕| 这里只有精品视频在线| A黄色视频| 久久AV秘一区二区三区水生| 操碰人人| 青青国产视频| 国产96在线亚洲| va色婷婷亚洲在线| 亚洲日韩在线视频观看| 精品国产区一区二| 成人无码免费一区二区中文 | 狠狠撸在线| 亚洲不卡| 欧美在线观看视频一区| 欧美最猛黑A片黑人猛交蜜桃视频| 国内自拍视频网站| 国产精品不卡一区二区三区| 九九亚洲| 青春草在线| 日韩无码人妻| 黄色福利网址| 欧美精品一区二区三区四区| 亚洲视频中文字母| 国产特黄级AAAAA片免| 精品视频免费在线观看| 好吊顶亚洲AV大香蕉色色| 成人激情综合| 无码视频在线观看免费| 青春草视频在线观看| 亚洲无码视频在线观看高清| 国产特级毛片AAAAAA| 99热播在线| 亚洲无码AV片| 日韩在线观看一区| 91无码在线观看| 日本高清版色视频| 十八禁福利网站| 亚洲AV成人一区二区三区不卡| av无码免费观看| 亚洲AV无码精品| 18禁在线播放| 国产精品久久久久久亚洲毛片| 午夜精品一区二区三区在线成人| 中文字幕五码| 成人激情综合| 国产精品无码永久免费不卡| 在线一区二区三区| 韩日午夜| 欧美操逼电影| 国产精品美女视频| 国产黄在线观看| 91综合网| 一级成人视频| 伊人大香蕉视频在线观看| 91无码AⅤ在线| 国产精品综合激情| 丁香五月天堂网| 91香蕉国产成人App| 伊人久久五月| XXXXⅩHD亚洲人HD| 无码人妻一区二区三区免费n狂飙| 波多野结衣高清无码| 毛片av在线| 大香蕉少妇| 西西444WWW无码精品| 九色PORNY自拍视频| 日韩精品一区二区三区免费观看高清| 国产无遮挡又黄又爽又| 午夜福利电影AV| 久久久久久毛片| 国产做受91| 丁香六月操| 你懂得视频在线观看| 无码人妻一区二区三区免水牛视频| 欧美大香蕉在线视频| 国产精品一二| 一道本无码免费视频| 51妺嘿嘿午夜福利视频| 影音先锋av资源网站| 中文字幕在线日韩| 精品无码久久久久久久久app| 男人天堂网av| 视频一区二区三| 亚洲国产中文字幕| 亚洲AV无码一区二区三竹菊 | 亚洲欧美国产另类| 91久久午夜无码鲁丝片久久人妻 | 久久黄色视频网站| 国产AV大香蕉| 多啪啪免费视频| 二区在线观看| 三级片自拍| 久热精品在线| 色色影音先锋| 亚洲成人av在线观看| AV在线不卡中文| henhengan| 又大又粗又爽| 国产做受91| 青青草婷婷| 欧美后门菊门交3p、| 久草免费电影| 三级网站在线| 超碰永久| 内射视频在线免费观看| 五月婷婷在线播放| 国产成人女人在线观看| 日韩在线91| 手机成人在线视频| 亚洲三级网站| 国产aaaaaaaaaaaaa| 亚洲成年视频| 国产爱搞| 黄网在线观看视频| 五月六月婷婷| 国产最新视频| 风情万种AV| 在线播放高清无码| 天天操夜| 日本高清无码| 天天夜夜有| 精品无码久久久| 足浴小少妇-88AX| 中文无码高清在线| 午夜成人中文字幕| 久久久网| 中文无码日本高潮喷水| 婷婷欧美日韩| 欧美高清性XXXXHDvideosex| 亚州精品国产精品乱码不99勇敢 | 国产精品久久久精品cos| 国产免费无码| 动漫操逼视频| 一区二区三区久久久久〖网:.〗 | yw视频在线观看| 久久久久久AV| 成人av影院| 四虎操逼| 大香蕉三级片| 国产激情123区| 一级性爽AV毛片| 这里都是精品| 久草大香蕉在线视频| 色色播| 玉米地一级婬片A片| 手机无码在线播放| 人人爽久久涩噜噜噜网站| 欧美激情五月| 欧美色图视频在线观看| 特级艺体西西444WWw| 五月婷婷激情| 丰满人妻一区二区三区46| 日本视频一区二区三区| 欧美黄片免费看| 免费草逼网站| 翔田千里一区二区三区| 美女黄色视频永费在线观看网站| 午夜免费小视频| 女生自慰网站在线观看| 欧美h| 欧美综合亚洲| 爱草视频| 亚洲午夜影院在线| 久久午夜电影| 午夜亚洲| 荫蒂添到高潮免费视频| 亚洲黄视频|