成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

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

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號
亚洲AV无码国产蜜桃麻豆| 四十路の五十路熟女豊満| 人妻中出无码一区二区三区| 日本丰满少妇毛茸茸| 上边一面亲下边一面膜的功效 | 日本JAPANESE 办公室丝| 日韩人妻无码一区2区3区| 我和岳乱妇三级高清电影| 亚洲AV无码专区国产乱码不卡| 亚洲欧洲无码精品ⅤA| 一区二区三区国产精华液区别| 99国产精品久久久久久久成人热| 把腿张开老子cao烂你在线视频| 高校美女内射含羞草| 好大好硬好深好爽想要20P| 老妇乱强伦XXXXX| 人狗大战JAVA代码| 无码囯产精品一区二区免费| 亚洲日本一本DVD高清| 99久久综合狠狠综合久久AⅤ| 动漫精品中文无码卡通动漫| 国产日韩综合一区在线观看| 久久久精品国产免大香伊| 女人18片毛片60分钟完整版| 色悠久久久久综合先锋影音下载| 亚洲AV无码一区二区乱子仑| 中文字日产幕码三区的做法大全| 草莓丝瓜芭乐鸭脖奶茶发型| 国产亚洲视频在线观看播放| 麻豆我精产国品一二三产区区别| 日韩AV无码久久一区二区| 亚洲AV自慰白浆喷水少妇| 37大但人文艺术A级都市天气| 国产96在线 | 亚洲| 久久99国产精品二区| 人妻人人做人碰人人添| 亚洲AV成人片无码www小说| 中文字幕精品亚洲无线码一区应用 | 公玩弄年轻人妻HD| 久久精品AⅤ无码中文字字幕| 欧美国产日韩久久MV| 无码人妻丰满熟妇精品区| 一区二区AV在线| 国产成人AV大片大片在线播放| 久久国产亚洲精品无码| 日韩AV高清在线观看| 亚洲男人AV香蕉爽爽爽爽| 爱丫爱丫影院在线看免费| 狠狠色噜噜狠狠狠7777奇米| 欧美最猛黑人XXXⅩ猛男视频| 亚洲av网站在线| А√天堂8资源官网在线BT种子| 国产又大又粗又黄又爽白丝| 欧美性爱AAAAA| 亚洲浮力影院久久久久久| 插花弄玉小说荔枝很甜作者卿凌| 精产国品一二三区别9977| 日本熟妇人妻XXXX| 野花日本免费完整版高清版8 | √最新版天堂资源网在线| 国产精品成人一区二区不卡| 女厕脱裤撒尿大全视频| 亚洲AV无码精品色午夜蜜芽| 把女人弄爽特黄A大片| 精品性高朝久久久久久久| 少妇又粗又大人妻无码| 18禁裸乳无遮挡啪啪无码免费| 国产三级精品三级在专区| 欧美一区二区视频在线| 亚洲色婷婷综合久久| 国产激情一区二区三区成人| 欧美粗大无套GAY| 亚洲女和黑人最新AV| 国产成人AV乱码免费观看| 欧美老熟妇乱大交XXXXX| 亚洲日本一线产区二线产区| 国产高潮呻吟无码精品AV| 欧美日韩久久中文字幕| 野花社区WWW在线视频官网| 国产精品无码专区在线播放| 人妻互换一二三区激情视频| 一本大道香蕉在线资源| 国产亚洲成AⅤ人片在线观看蜜桃 国产亚洲成AⅤ人片在线观看麻豆 | 久久久久亚洲精品无码系列| 亚洲AV成人噜噜无码网站| 恶毒美人长批后被宿敌爆炒了| 女人被第一次18毛片| 亚洲中文字幕无码中文字| 国产又爽又粗又猛的视频| 少妇特殊按摩高潮爽翻天| YW尤物AV无码国产在线观看| 老肥熟妇丰满大屁股在线播放| 亚洲国产精品无码中文字| 国产精品99久久久久久宅男| 日韩AV无码成人精品国产| 77777亚洲午夜久久多喷| 久久九九久精品国产| 亚洲AV无码成人精品网站| 国产成人猛男69精品视频| 人妻少妇一级毛片内射一牛影视| 在线观看成人无码中文AV天堂| 精品无码国产自产拍在线观看蜜 | 人人妻人人澡人人爽人人精品图片| 中国在线观看免费国语版| 精品人妻一区二区三区四区在线 | 18禁止福利午夜体验试看| 久久精品香蕉绿巨人登场| 亚洲AV片毛片成人观看| 国产精品特级露脸AV毛片| 色综合色综合色综合色欲| 边做边爱完整版免费视频播放百度| 每晚都被他添的流好多水| 夜夜高潮夜夜爽高清完整版1| 娇妻出轨哀求高潮喷水| 亚洲AV无码成人片在线观看一区| 国产精品一区二区高清在线| 四十如虎的丰满熟妇啪啪| 反差小青梅不经C1V1| 如饥似渴LA.VORACE| 草莓视频IOS下载| 日本大片免费观看视频| 啊灬啊灬别停啊灬用力啊免费| 欧美人妻兽交V1DE0S| H无码动漫在线观看人| 欧美性猛交XXXX乱大交3| FUCK东北老熟女人HD叫床| 欧美日本操逼视频| YSL千人千色T9T9T9T| 人妻一区二区三区在线| 八区精品色欲人妻综合网| 任你躁国产自任一区二区三区| 八戒八戒神马影院在线4 | 驯服小挗子2韩语中字| 国精产品一线二线三线 | 太大太长太粗太久太硬了| 国产成A人亚洲精V品无码性色 | 国产成人综合色视频精品| 铜铜铜铜铜铜铜铜好大免费| 寡妇好丰满奶好大| 推拿完整版中文字幕| 国产日产欧产系列| 亚洲JIZZJIZZ中国少妇| 精品无码国产自产野外拍在线| 亚洲欧美综合区自拍另类| 久久国产乱子伦免费精品| 永久免费AV无码网站国产APP | 1000部无遮挡拍拍拍免费视频| 男生晚上睡不着想看B站| FREEXX性黑人大战欧美| 日产乱码一二三区别免费必看| 疯狂做受XXXX高潮国产| 小雪尝禁果又粗又大的动态视频| 国内精品久久久久久中文字幕 | А天堂最新版中文网| 日韩精品无码一区二区三区视频 | GOGO全球高清专业大尺度摄影| 日本乱偷人妻中文字幕久久| 国产成人无码A区在线观看视频| 午夜性又黄又爽免费看尤物| 狠狠88综合久久久久综合网| 野花日本大全免费观看2019| 男人J桶进女人P无遮挡全过程 | 人妻丰满熟AV无码区HD| 国产成人a在线看片色欲AV| 亚洲AⅤ无码精品一区二区三区| 精品浪潮av一区二区三区 | 亚洲AV无码无在线观看| 久久亚洲日韩成人无码| AV中文字幕潮喷人妻系列| 少妇做爰免费视频网站| 极品粉嫩小泬无遮挡20P| 中文字幕一区二区三区乱码人妻 | 丰满少妇XXXⅩBBBB视频| 亚洲AV喷水无码XXX| 蜜桃久久久久久精品免费观看| 成A人片亚洲日本久久| 性色AⅤ一二三天美传媒| 久久天天躁狠狠躁夜夜网站| CHINA 农村妇女NOMEX| 四虎影视永久无码精品| 九九九九精品视频在线观看 | 国产精品自产拍在线18禁| 亚洲人成人无码网WWW国产| 欧美性爱在线视频| 国产乱亲BBBB| 中年人妻丰满AV无码久久不卡| 日日麻批免费40分钟无码| 国色天香果冻传媒国卡1区| 最新无码国产在线视频2021| 色777狠狠狠综合| 久久99国产精品久久99蜜桃| YY1111111少妇无码影院| 亚洲6080YY久久无码产自国| 美女高潮潮喷出白浆视频| 国产92刮伦脏话对白| 野花高清完整版免费观看视频电视 | 亚洲AⅤ国产成人AV片妓女| 牛和人交VIDEOS欧美3D| 国产精品未满十八禁止观看| 重口00Ⅹ变态另类|