gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

vue中用到es6特性有哪些

特性:1、let和const關鍵字,用于聲明變量;2、“for…of”循環,可迭代數據;3、Iterable,是實現可迭代協議的任何對象;4、Generator;5、默認參數;6、解構賦值語法,可以將屬性/值從對象/數組中取出;7、剩余/展開參數;8、箭頭函數;9、對象字面量;10、Class;11、Map/Set/WeakMap/WeakSet數據結構;12、Promise。

vue中用到es6特性有哪些

本教程操作環境:windows7系統、vue3版,DELL G3電腦。

ECMAScript 6.0(以下簡稱 ES6)是 Javascript 語言的下一代標準,正式發布與2015年6月。它的目標,是使得Javascript語言可以用來編寫復雜的大型應用程序,成為企業級開發語言。

ECMAScript 6,即所謂的現代 Javascript,具有強大的功能,例如塊作用域、類、箭頭功、生成器以及許多其他有用的功能。

在Vue應用開發中使用的所有必要功能來改善編程體驗,提高開發效率及代碼質量。通過Vue CLIBabelcore-js集成,使開發中的代碼嚴格按照配置規范進行迭代,有助于團隊協作。本文介紹幾個再Vue應用開發中常用的ES6的特征。

let/const

ES6最基本的功能:letconst

letvar類似,但使用let聲明的變量的作用域是在聲明它們的塊中。(Block指條件塊,for循環塊等)

例如,在條件塊中使用let將在塊內作用域變量,在塊外不可用。

if (true) {     let foo = "word"; }  console.log(foo); // error
登錄后復制

在這里,錯誤是一件好事,因為它可以防止在生產過程中發生潛在的錯誤。

如果在上面的例子中使用var(就像在傳統的Javascript代碼中那樣)而不是let,就不會出現錯誤。

const是另一個用于聲明變量的ES6關鍵字。不同之處在于const創建的變量在聲明之后不能更改,這個特點可以有效的避免BUG的出現,因此在編寫代碼過程中,建議盡量寫純函數(純函數,就是給定函數固定的輸入,輸出的結果就是固定的,不會受函數外的變量等的影響)。

例如:

const a = 2021 a = 2020 // error
登錄后復制

有幾種創建變量的方法,我們應該使用哪一種?

最好的做法是盡可能使用const。只有當你需要一個以后需要更改的變量時才使用let,比如在for循環中。

for…of

說到循環,在ES6語法中有一種更簡單的方法來編寫for循環,甚至不需要使用let

例如,一個傳統的for循環是這樣的:

const arr = [1, 2, 3];  for (let i = 0; i < arr.length; i++) {     const item = arr[i];     console.log(item); }
登錄后復制

在ES6中,非常簡單:

const arr = [1, 2, 3];  for (const item of arr) {     console.log(item); }
登錄后復制

不要與for..in語法混淆;他們是完全不同的東西。 for..in將獲得數組/對象中的屬性,而for..of將獲得實際想要迭代的數據。

Iterable

可迭代對象是實現可迭代協議的任何對象。(協議只是指需要通過在對象中使用特定名稱的特定方法來滿足的需求)。

例如,下面是一個實現了iterable協議的對象:

const twice = {     [Symbol.iterator]() {         let i = 0;         const iterator = {             next() {                 if (i < 2) {                     return { value: i++, done: false };                 } else {                     return { value: undefined, done: true };                 }             },         };         return iterator;     }, };
登錄后復制

登錄后復制

現在可以在for..of循環中使用此twice對象:

for(const x of twice){   console.log(x) }
登錄后復制

這會對twice對象進行兩次循環,分別得到01

為了創建一個可迭代對象,實際上實現了兩個協議,iterable協議和iterator協議。

為了滿足作為可迭代對象的要求,需要一個名為[Symbol.iterator]的方法。

const twice = {   [Symbol.iterator]() {     ...   } }
登錄后復制

方法名中應用了兩個新的ES6技巧。

首先,Symbol.iterator 一個內置的符號值,而Symbol是ES6中用于創建唯一標簽/標識符的基本類型。

其次,包裝屬性鍵的方括號使它成為一個動態計算的鍵。這里的關鍵是表達式符號。迭代器將被求值為,通常不關心實際的求值是什么。這個不重要的細節被抽象掉了。

這就是可迭代的協議。現在仍然需要處理迭代器協議來創建可迭代的對象,因為必須從 [Symbol.iterator] 函數返回一個迭代器

迭代器協議更簡單。只需要一個對象有一個next方法即可返回帶有兩個鍵的對象:valuedone。當要停止迭代時,只需返回對象{value:undefined,done:true}

這是示例中的迭代器:

const iterator = {     next() {         if (i < 2) {             return { value: i++, done: false };         } else {             return { value: undefined, done: true };         }     }, };
登錄后復制

總之,有一個同時滿足可迭代協議和迭代器協議的對象。如以下代碼:

const twice = {     [Symbol.iterator]() {         let i = 0;         const iterator = {             next() {                 if (i < 2) {                     return { value: i++, done: false };                 } else {                     return { value: undefined, done: true };                 }             },         };         return iterator;     }, };
登錄后復制

登錄后復制

數組和字符串可以使用for..of,進行迭代。這意味著這些內置類型包含與上面的類似的[Symbol.iterator]方法。

Generator:生成器

與迭代相關的另一個功能是生成器。

上面的可迭代代碼依靠閉包來存儲 i 變量。使用 generator 時,不必擔心自己構造閉包:

function* twiceGen() {     let i = 0;     while (i < 2) {         yield i;         i++;     } }  const twice = twiceGen();
登錄后復制

該代碼實現了與可迭代示例相同的行為,但更為簡單。

可以與for..of完全相同地使用它:

for(const item of twice){   console.log(item) }
登錄后復制

如你所見,它是一個帶有星號(*)聲明的函數。它使用yield關鍵字逐個抽取值,就像迭代器的next方法一樣。

生成器是一種多功能工具,基本上,它是一種允許暫停/恢復功能的機制。不必在for..of中使用上述twice對象。可以調用它的next方法。

function* twiceGen() {     const i = 0;     while (i < 2) {         yield i;     } }  const twice = twiceGen();  twice.next().value; // 0
登錄后復制

此時,twiceGen函數在第一次運行while循環后暫停。如果再次運行相同的操作,它將恢復并播放循環的第二次運行。

twice.next().value; // 1
登錄后復制

生成器的妙處在于它還創建了一個可迭代的迭代器對象。這就是為什么我們能夠使用for..of(可迭代特權)迭代兩次并直接調用其next方法(迭代器特權)的原因。

Default Parameter:默認參數

可能不會立即創建自己的迭代器、生成器,所以讓我們來看看其他一些ES6的獨創性,它們可以立即使你的代碼更加友好。

就像許多其他編程語言一樣,現在可以為函數參數設置默認值。

過去是這樣實現默認值的:

function addOne(num) {     if (num === undefined) {         num = 0;     }     return num + 1; }  addOne();
登錄后復制

現在可以這樣:

function addOne(num = 0) {     return num + 1; }  addOne();
登錄后復制

Destructuring Syntax:解構語法

解構賦值語法是一種 Javascript 表達式。通過解構賦值, 可以將屬性/值從對象/數組中取出,賦值給其他變量。

如果要將對象傳遞給函數,則可以輕松選擇對象的屬性,然后使用ES6分解語法將它們放在單獨的變量中:

function foo({ a, b }) {     console.log(a, b); // 1, 2 }  foo({ a: 1, b: 2 });
登錄后復制

這種解構語法的好處是可以避免創建帶有附加代碼行的變量。因此不需要像下面這樣:

function foo(obj) {     const a = obj.a;     const b = obj.b;     console.log(a, b); // 1, 2 }
登錄后復制

同樣,還可以在解構語法中設置默認值:

function foo({ a = 0, b }) {     console.log(a, b); // 0, 2 }  foo({ b: 2 });
登錄后復制

解構語法也適用于賦值:

function foo(obj) {     const { a, b } = obj;     console.log(a, b); // 1, 2 }
登錄后復制

當從參數以外的地方獲取對象時,這也很有用。

function getObj() {     return { a: 1, b: 2 }; }  function foo() {     const { a, b } = getObj();     console.log(a, b); // 1, 2 }
登錄后復制

解構技巧同樣也適用數組。

解構參數:

function foo([a, b]) {     console.log(a, b); // 1, 2 }  foo([1, 2, 3]);
登錄后復制

解構賦值:

function foo(arr) {     const [a, b] = arr;     console.log(a, b); // 1, 2 }
登錄后復制

Rest / Spread :剩余 / 展開參數

在解構數組時,可以使用 ... 語法來獲取數組中的所有其他項。

function foo([a, b, ...c]) {     console.log(c); // [3, 4, 5] }  foo([1, 2, 3, 4, 5]);
登錄后復制

c現在是一個包含自己的數組,包含了其余的元素:345。這里的操作就是Rest操作。

這個語法同樣適用于賦值:

function foo(arr) {     const [a, b, ...c] = arr;     console.log(c); // [3, 4, 5] }  foo([1, 2, 3, 4, 5]);
登錄后復制

rest操作符也可以單獨使用,無需解構:

function foo(...nums) {     console.log(nums); // [1, 2, 3, 4, 5] }  foo(1, 2, 3, 4, 5);
登錄后復制

在這里,我們將數字作為獨立參數傳遞,而不是作為單個數組傳遞。但是在函數內部,使用rest運算符將數字作為單個數組收集。當遍歷這些參數時,這很有用。

rest語法 ... 與另一個ES6特性操作符擴展完全相同。

例如,如果要將兩個數組合并為一個:

const a = [1, 2]; const b = [3, 4]; const c = [...a, ...b]; console.log(c); // [1, 2, 3, 4]
登錄后復制

spread操作符用于將所有項展開,并將它們放入不同的數組中。

spread也適用于對象:

const obj = { a: 1, b: 2 }; const obj2 = { ...obj, c: 3 }; console.log(obj2); // { a: 1, b: 2, c: 3 }
登錄后復制

現在,第二個對象除了其自身的屬性外,還應包含第一個對象的所有內容。

Arrow Function:箭頭函數

ES6提供了創建函數,對象和類的更簡單方法。

箭頭函數表達式的語法比函數表達式更簡潔,并且沒有自己的thisargumentssupernew.target。箭頭函數表達式更適用于那些本來需要匿名函數的地方,并且它不能用作構造函數

使用箭頭語法來創建更簡潔的函數:

const addOne = (num) => {     return num + 1; };
登錄后復制

箭頭語法對于創建單行函數更加簡潔友好。

const addOne = (num) => num + 1;
登錄后復制

此函數將自動返回表達式num +1的求值作為返回值,不需要顯式的使用return關鍵字。

如果函數僅接受一個參數,甚至可以省略括號(但是在嚴格語法上還是建議加上括號):

const addOne = num => num + 1;
登錄后復制

但是如果沒有任何參數,仍然需要一對空括號:

const getNum = () => 1;
登錄后復制

但是,此語法有一個警告,如果我們返回的是對象字面量,則無法使用,會報錯:

const getObj = () => { a: 1, b: 2 } // error
登錄后復制

這將產生語法錯誤,因為解析器將假定花括號用于函數塊,而不是對象字面量。

為了避免這個錯誤,必須將對象字面量包裝在一對括號中:

const getObj = () => ({ a: 1, b: 2 });
登錄后復制

另一件需要記住的事情是,this關鍵字不能在箭頭函數中使用。它不會出現錯誤;相反,它只會從周圍的范圍提供相同的this引用。

function thatOrThis() {     const that = this;     const compare = () => {         console.log(that === this); // true     };     compare(); }  thatOrThis();
登錄后復制

以上代碼給出的值則為:true

Object literal extensions:對象字面量的擴展

ES6也提供了一種更簡單的方法來創建對象字面量。

如果在一個對象中放入兩個項目,它們的屬性鍵與變量相同,可以用傳統的Javascript做這樣的事情:

const a = 1; const b = 2; const obj = {     a: a,     b: b, };
登錄后復制

但是在ES6中,語法可以更簡單:

const a = 1;const b = 2;const obj = { a, b };
登錄后復制

如果把方法放到對象字面量中,可以這樣做:

const a = 1; const b = 2; const obj = {     a,     b,     getA() {         return this.a;     },     getB() {         return this.b;     }, };
登錄后復制

基本上,沒有function關鍵字和冒號。

Class:類

ES6提供了類似于其他面向對象語言的類構造。現在不必依賴于混淆構造函數和原型方式。

class Person {     constructor(name, hobby) {         this.name = name;         this.hobby = hobby;     }      introduce() {         console.log(`大家好,我的名字叫:${this.name},我喜歡${this.hobby}。`);     } }  const devpoint = new Person("DevPoint", "coding"); devpoint.introduce();
登錄后復制

附帶說明,introduce方法中的字符串稱為模板字符串,它是使用反引號而不是引號創建的。這樣可以使用美元符號和大括號將表達式插入字符串。

與常規字符串拼接相比,模板字符串的好處是它可以跨越多行:

const str = `line 1 line 2 line 3 `; console.log(str);
登錄后復制

它被稱為模板字符串,因為它對實現模板很有用。

function pStr(text) {     return `<p>${text}</p>`; }  pStr("Hello world"); // <p>Hello world</p>
登錄后復制

一個類可以從另一個類繼承(重用現有類的代碼):

class Person {     constructor(name, hobby) {         this.name = name;         this.hobby = hobby;     }      introduce() {         console.log(`大家好,我的名字叫:${this.name},我喜歡${this.hobby}。`);     } }  class ProfessionalPerson extends Person {     constructor(name, hobby, profession) {         super(name, hobby); // 執行 Person 的構造函數         this.profession = profession;     }      introduce() {         super.introduce(); // 調用 Person 類的方法         console.log(`我的職業是 ${this.profession}。`);     } }  const devpoint = new ProfessionalPerson("DevPoint", "coding", "程序員"); devpoint.introduce();
登錄后復制

這里使用extends關鍵字在兩個類之間創建繼承關系,其中Person為父類。代碼中用了兩次super關鍵字,第一次是在構造函數中調用父類的構造函數,第二次,像使用對象一樣使用它來調用父類的introduce方法。super關鍵字的行為會因使用的位置而異。

在構造函數中使用時,super關鍵字將單獨出現,并且必須在使用this關鍵字之前使用。如下代碼就是有異常的。

class ProfessionalPerson extends Person {     constructor(name, hobby, profession) {         this.profession = profession;    // 這里會出現異常         super(name, hobby); // 執行 Person 的構造函數     }      introduce() {         super.introduce(); // 調用 Person 類的方法         console.log(`我的職業是 ${this.profession}。`);     } }
登錄后復制

Map / Set / WeakMap / WeakSet

ES6新增了兩種數據結構:MapSet

Map鍵-值對的集合,并且能夠記住鍵的原始插入順序。

const mapPerson = new Map(); mapPerson.set("name", "DevPoint"); mapPerson.set("profession", "Coding"); const myName = mapPerson.get("name"); console.log(myName); // DevPoint
登錄后復制

Map對象可以使用任何對象類型作為鍵。看起來是不有點像Object,下面我們可以看看他們的比較:

Map Object
意外的鍵 Map 默認情況不包含任何鍵,只包含顯式插入的鍵。 一個 Object 有一個原型,原型鏈上的鍵名有可能和你自己在對象上的設置的鍵名產生沖突。
鍵的類型 Map 的鍵可以是任意值,包括函數、對象或任意基本類型。 一個 Object 的鍵必須是一個 String 或是 Symbol
鍵的順序 Map 中的 key 是有序的。因此,當迭代的時候,一個 Map 對象以插入的順序返回鍵值。 一個 Object 的鍵是無序的
Size Map 的鍵值對個數可以輕易地通過 size 屬性獲取 Object 的鍵值對個數只能手動計算,需要自己構建方法
迭代 Map 是 iterable 的,所以可以直接被迭代。 迭代一個 Object 需要以某種方式獲取它的鍵然后才能迭代。
性能 在頻繁增刪鍵值對的場景下表現更好 在頻繁添加和刪除鍵值對的場景下未作出優化

Set對象就像一個數組,但是僅包含唯一項。Set對象是值的集合,可以按照插入的順序迭代它的元素。 Set中的元素只會出現一次,即 Set 中的元素是唯一的。

const numbers = new Set(); numbers.add(1); numbers.add(1); console.log(numbers); // Set { 1 }
登錄后復制

盡管兩次add是同樣的值,程序本身不會出現任何異常,但該集合仍然只包含一項。

讓談談來學習一點更復雜的知識,WeakMapWeakSet。它們分別是MapSet的弱引用版本。

WeakMap其鍵必須是Object,而值可以是任意的。

WeakSet 對象是一些對象值的集合, 并且其中的每個對象值都只能出現一次,在WeakSet的集合中是唯一的。

它和 Set 對象的區別有兩點:

  • Set相比,WeakSet 只能是對象的集合,而不能是任何類型的任意值。
  • WeakSet持弱引用:集合中對象的引用為弱引用。 如果沒有其他的對WeakSet中對象的引用,那么這些對象會被當成垃圾回收掉。 這也意味著WeakSet中沒有存儲當前對象的列表。 正因為這樣,WeakSet 是不可枚舉的。

一旦不再引用WeakMap的鍵,便會對其進行垃圾回收(由Javascript運行時從內存中刪除)。

let key1 = {}; const key2 = {}; const wm = new WeakMap(); wm.set(key1, 1); wm.set(key2, 2); key1 = null; // 取消引用
登錄后復制

key1被取消引用之后,它的對應值將被垃圾回收,意味著它將在未來的某個時間點消失。

同樣,如果將一個對象添加到WeakSet中,然后再取消引用它,它也將被垃圾回收。

let item1 = {}; const item2 = {}; const ws = new WeakSet(); ws.add(item1); ws.add(item2); item1 = null; // 取消引用
登錄后復制

Promise

Promise 對象用于表示一個異步操作的最終完成 (或失敗)及其結果值。是ES6的一個常用功能,它是對傳統函數回調模式的改進。

一個 Promise 必然處于以下幾種狀態之一:

  • 待定(pending): 初始狀態,既沒有被兌現,也沒有被拒絕。
  • 已兌現(fulfilled): 意味著操作成功完成。
  • 已拒絕(rejected): 意味著操作失敗。

例如,這是使用傳統回調的方式:

setTimeout(function () {     const currentTime = new Date();     console.log(currentTime); }, 1000);
登錄后復制

這是一個計時器,顯示一秒鐘后的時間。

這是一個使用相同setTimeout邏輯的Promise對象:

const afterOneSecond = new Promise(function (resolve, reject) {     setTimeout(function () {         const currentTime = new Date();         resolve(currentTime);     }, 1000); });
登錄后復制

它接受帶有兩個參數的函數:resolvereject。這兩個都是當有返回值時可以調用的函數。調用resolve函數返回一個值,可以調用reject函數返回一個錯誤。

然后,可以使用then語法將回調函數附加到這個afteronessecond對象上:

afterOneSecond.then((t) => console.log(t));
登錄后復制

promise相對于傳統回調的好處是promise對象可以被傳遞。因此,在設置promise之后,可以自由地將它發送到其他地方,以處理計時器解析后要做的事情。

另一個很酷的事情是,promise可以與多個then子句鏈接在一起,即promise的鏈式調用。

afterOneSecond.then((t) => t.getTime())               .then((time) => console.log(time));
登錄后復制

每個then子句將其值作為參數返回到下一個then子句。

實用方法

下面就來介紹在VUE中,比較實用的ES6的方法或屬性。

Object.assign()

Object.assign() 方法用于將所有可枚舉屬性的值從一個或多個源對象分配到目標對象。它將返回目標對象。提供了一種簡單的方法來淺克隆現有對象

const obj1 = { a: 1 } const obj2 = Object.assign({}, obj1)
登錄后復制

String.prototype.repeat()

構造并返回一個新字符串,該字符串包含被連接在一起的指定數量的字符串的副本。

const str = "DevPoint ".repeat(3);console.log(str); // DevPoint DevPoint DevPoint
登錄后復制

String.prototype.startsWith()

用來判斷當前字符串是否以另外一個給定的子字符串開頭(區分大小寫),并根據判斷結果返回 truefalse

const str = "DevPoint".startsWith("D"); const str2 = "DevPoint".startsWith("d"); console.log(str); // true console.log(str2); // false
登錄后復制

String.prototype.endsWith()

用來判斷當前字符串是否是以另外一個給定的子字符串“結尾”的,根據判斷結果返回 truefalse

const str = "DevPoint".endsWith("t");  console.log(str); // true
登錄后復制

String.prototype.includes()

用于判斷一個字符串是否包含在另一個字符串中,根據情況返回 truefalse

const str = "DevPoint".includes("P"); console.log(str); // true
登錄后復制

Array.prototype.find()

返回數組中滿足提供的過濾函數的第一個元素的值,否則返回 undefined

const arrNumbers = [5, 12, 8, 130, 44]; const foundNumbers = arrNumbers.find((number) => number > 10); console.log(foundNumbers);   // 12是數組第一個大于10的數
登錄后復制

Function.name

這不是方法而是屬性,返回函數實例的名稱,每個函數都有一個name屬性,該屬性提供字符串形式的函數名稱

// setTimeout.name; // "setTimeout"  const weather = () => {     console.log("今天天氣真好!"); }; const devpoint = () => {};  // 限制回到函數的名稱 const enter = (callback) => {     const accessName = ["weather"];     if (accessName.includes(callback.name)) {         callback();     } }; enter(devpoint); enter(weather);
登錄后復制

上述代碼只執行了函數 weather

總結

ES6的新特征,某種程度上代表的Javascript在未來的態度,這些新的特征讓我迫不及待應用到項目中,不斷接受新挑戰,提升自己技能。

(學習視頻分享:vuejs入門教程、編程基礎視頻)

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
dy888午夜| 欧洲熟妇精品视频| 青青在线视频免费| 少妇久久久久久被弄到高潮| 亚洲欧美另类动漫| 久久久久久免费看| 日本不卡一区二区三区四区| 午夜肉伦伦影院| 成人av在线不卡| 夜夜夜夜夜夜操| 亚洲不卡视频在线| 天天摸天天碰天天添| 欧美乱大交xxxxx潮喷l头像| 日韩欧美中文在线视频| 午夜啪啪小视频| 免费涩涩18网站入口| 成人性视频欧美一区二区三区| 欧美久久久久久久久久久久久久| 日韩成人精品视频在线观看| 五月婷婷六月丁香激情| 十八禁视频网站在线观看| 亚洲一区二区三区av无码| 一级特黄妇女高潮| 男人日女人的bb| 青青草综合在线| 黄色小视频大全| 天天想你在线观看完整版电影免费| 亚洲一级片av| 四虎成人在线播放| 男插女免费视频| 强伦女教师2:伦理在线观看| 美女扒开大腿让男人桶| 成年人午夜免费视频| 欧美视频免费看欧美视频| 无码人妻精品一区二区三区在线| 欧美 日韩 国产在线观看| 中文字幕日本最新乱码视频| 国产xxxxx视频| 国产福利在线免费| 五月天综合婷婷| 狠狠干 狠狠操| 一区二区三区网址| 91社在线播放| 日日碰狠狠添天天爽超碰97| 男人搞女人网站| 夜夜爽久久精品91| 亚洲人精品午夜射精日韩| 能看的毛片网站| 亚洲精品永久视频| 日本a级片在线播放| www.中文字幕在线| 激情图片中文字幕| 日本一道本久久| 天堂中文av在线| 97国产在线播放| 中文字幕日韩综合| 波多野结衣家庭教师在线| 99视频在线视频| 精品久久久久久无码中文野结衣| 欧美成人精品欧美一级乱| 欧美视频亚洲图片| 国产精品欧美激情在线观看| 亚洲女人在线观看| 亚洲中文字幕无码不卡电影| 欧美xxxx吸乳| av污在线观看| 国产精品网站免费| 法国空姐在线观看免费| 91福利国产成人精品播放| www.亚洲成人网| 亚洲精品视频三区| 亚洲不卡视频在线| 91.com在线| 毛片毛片毛片毛片毛| 国产视频一区二区三区在线播放| 国产91在线亚洲| 国产女同无遮挡互慰高潮91| 国产又黄又猛视频| 无码专区aaaaaa免费视频| 国产欧美自拍视频| 色婷婷激情视频| 少妇黄色一级片| 无码精品国产一区二区三区免费| 免费在线黄网站| 激情成人开心网| 法国空姐在线观看免费| 91插插插影院| 日韩av影视大全| 中文字幕55页| 日韩第一页在线观看| 日本黄色福利视频| 久久久久久蜜桃一区二区| 校园春色 亚洲色图| wwwwxxxx日韩| www.色偷偷.com| 在线免费观看av的网站| 国产免费又粗又猛又爽| 成人免费在线观看视频网站| 日本在线一二三区| 人人妻人人澡人人爽精品欧美一区| 成年网站在线播放| 中文字幕12页| 成人高清在线观看视频| 香蕉视频在线网址| 激情五月六月婷婷| 欧美 日本 亚洲| 日韩无套无码精品| 国产亚洲视频一区| 992kp免费看片| 久草视频这里只有精品| 亚洲国产精品无码观看久久| 免费黄色福利视频| 亚洲欧美日韩精品一区| 国产日韩欧美大片| 成人免费aaa| 亚洲高清免费在线观看| 亚洲制服在线观看| 日本中文字幕在线视频观看| 亚洲精品高清无码视频| 国产精品igao网网址不卡| 欧美美女黄色网| 欧美在线观看视频网站| 亚洲免费视频播放| 麻豆av免费在线| 国产精品久久成人免费观看| 国产91在线视频观看| 蜜臀一区二区三区精品免费视频| 成人在线观看www| 欧美日韩在线不卡视频| 色姑娘综合天天| 国产xxxxx在线观看| 成人手机视频在线| 免费激情视频在线观看| 黄色一级视频播放| 久久久久久久少妇| 日韩国产成人无码av毛片| 欧美午夜aaaaaa免费视频| 波多野结衣 作品| 三上悠亚在线一区二区| 成人性免费视频| 免费成人深夜夜行网站视频| 精品久久久久av| 精品人妻人人做人人爽| 婷婷中文字幕在线观看| 成人一级片网站| 成人黄色大片网站| 三年中国中文在线观看免费播放| 男女曰b免费视频| 国产精品无码免费专区午夜| 超碰中文字幕在线观看| 日本免费观看网站| 日本免费不卡一区二区| 日韩在线观看a| 超碰人人爱人人| 日本特级黄色大片| 99精品视频国产| 亚洲一区二区三区观看| 在线看的黄色网址| 国产情侣av自拍| 久久9精品区-无套内射无码| 九一国产精品视频| 色欲色香天天天综合网www| 国产一级大片免费看| 无颜之月在线看| 成人国产一区二区三区| 五月天在线免费视频| 黄色一级视频播放| www国产免费| 久久精品无码中文字幕| 中国丰满熟妇xxxx性| 久久99久久99精品| 国产96在线 | 亚洲| 欧美三级一级片| 欧美私人情侣网站| 免费一区二区三区在线观看| 国产精品久久久毛片| 亚洲午夜精品一区| 亚洲综合在线一区二区| 日韩中文在线字幕| 欧美一区二区中文字幕| 老头吃奶性行交视频| 亚洲免费黄色网| 男女啪啪免费观看| 国产91在线免费| 色噜噜狠狠永久免费| 国产美女视频免费| 国产91在线免费| 永久免费的av网站| 福利在线一区二区| 国产精品69页| 午夜影院免费观看视频| 国内少妇毛片视频| 最新天堂中文在线| 国产精品视频一二三四区| 成年人免费在线播放| 亚洲天堂av一区二区三区| 91动漫在线看| 好男人www社区| 青草全福视在线| 一区二区在线播放视频|