久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久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現在是一個包含自己的數組,包含了其余的元素:3,4,5。這里的操作就是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提供了創建函數,對象和類的更簡單方法。

箭頭函數表達式的語法比函數表達式更簡潔,并且沒有自己的this,arguments,supernew.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號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
久久99偷拍| 日本精品在线播放| 亚洲精品欧洲| 日韩av在线免费观看不卡| 在线视频亚洲| 怡红院精品视频在线观看极品| 成人久久一区| 91精品高清| 综合激情一区| 精品久久97| 久久99蜜桃| 国产精品13p| 丝袜av一区| 日韩午夜视频在线| 国产精品天天看天天狠| 国产一区二区色噜噜| 精品欧美久久| 亚洲欧美专区| 久久久国产精品入口麻豆| 日韩成人精品一区二区| 欧美日韩国产传媒| 日本亚洲不卡| 日韩精品久久久久久久电影99爱| 日韩中文字幕亚洲一区二区va在线| 日韩av中文字幕一区二区三区| 亚洲开心激情| 美女视频一区在线观看| 午夜精品影院| 国产视频一区二区在线播放| 老司机精品视频在线播放| 99视频精品全国免费| 伊人www22综合色| www.com.cn成人| 99riav1国产精品视频| 免费在线观看一区| 免费在线观看视频一区| 狠狠久久伊人| 日韩激情网站| 亚洲精品1区| 国产96在线亚洲| 性欧美69xoxoxoxo| 久久只有精品| 欧美日本一区| 香蕉久久夜色精品国产| 福利在线一区| 欧美日韩1区| 亚洲午夜国产成人| 中文国产一区| 欧美三级精品| 国产一区二区久久久久| 日韩精彩视频在线观看| 免费美女久久99| 久久国产高清| 日韩激情视频网站| 久久成人亚洲| 日韩不卡免费高清视频| 国产高潮在线| 国产日产精品一区二区三区四区的观看方式 | 日韩中文在线电影| 日韩精品视频在线看| 美女久久网站| 夜夜嗨av一区二区三区网站四季av| 欧美国产另类| 久久不卡国产精品一区二区| 日韩中文一区二区| 日韩黄色av| 日本三级亚洲精品| 久久亚洲国产精品一区二区| 久久精品高清| 亚洲高清久久| 麻豆久久精品| 日本视频在线一区| 日韩av午夜在线观看| 欧美一区久久| 美女精品一区二区| 亚洲一区资源| 欧美综合二区| 欧美日本久久| 日本精品久久| 国产精品欧美日韩一区| 国产精品对白久久久久粗| 欧美日韩一区二区三区在线电影| 亚洲综合图色| 精品免费av| 91精品二区| 欧美偷窥清纯综合图区| 国产66精品| 国产 日韩 欧美一区| 久久久久网站| 日本亚洲不卡| 久久中文字幕二区| 亚洲精品成人一区| 久久久久久夜| 国精品一区二区| 日本v片在线高清不卡在线观看| 激情久久99| 日韩中文字幕av电影| 爽爽淫人综合网网站| 国产高清精品二区| 久久亚洲欧洲| 在线天堂中文资源最新版| 丝袜美腿亚洲色图| 波多野结衣久久精品| 欧美一区二区三区久久精品| 午夜精品一区二区三区国产| 日本aⅴ免费视频一区二区三区| 成人日韩精品| 久久99蜜桃| 丝袜脚交一区二区| 亚洲小说欧美另类婷婷| 久久精品99国产国产精| 三级在线观看一区二区| 国产精品videosex极品| 蜜臀久久久久久久| 日韩精品dvd| 精品无人区麻豆乱码久久久| 久久福利影视| 久久视频国产| 国产精品国产一区| 人人爱人人干婷婷丁香亚洲| 黑丝一区二区三区| 久久久久免费av| 三级精品视频| 日韩三区在线| 国精品一区二区三区| 老司机免费视频一区二区| 国产精品嫩草影院在线看| 美女毛片一区二区三区四区| 精精国产xxxx视频在线播放| 97精品国产福利一区二区三区| 欧美黄色一区| 日本不卡视频一二三区| 蜜臀av亚洲一区中文字幕| 免费久久99精品国产| 在线亚洲精品| 亚洲免费资源| 91九色综合| 久久99高清| 在线一区视频观看| 日韩不卡在线| 四虎影视精品| 国产高潮在线| 中文字幕高清在线播放| 精品久久福利| 久久久久久黄| 日韩精品一级二级| 亚洲人亚洲人色久| 国产情侣久久| 国产不卡精品| 一区在线视频观看| 日本不卡不码高清免费观看 | 国产一区二区三区亚洲| 美女精品一区| 久久国产麻豆精品| 国产69精品久久| 91高清一区| 国产精品嫩草影院在线看| 国产福利片在线观看| 伊人www22综合色| 国产精品九九| 欧美日韩国产免费观看视频| 日韩中文欧美在线| 欧美亚洲一级| 欧美日韩亚洲在线观看| 亚洲精选av| 日本欧美韩国一区三区| 亚洲自拍另类| 美腿丝袜在线亚洲一区| 国产高清精品二区| 合欧美一区二区三区| 日本在线视频一区二区| 亚洲综合在线电影| 日韩avvvv在线播放| 理论片午夜视频在线观看| 亚洲精品欧洲| 欧美在线亚洲综合一区| 精品精品久久| 婷婷亚洲成人| 久久一区二区中文字幕| 日本电影久久久| 尹人成人综合网| 麻豆成全视频免费观看在线看| 综合欧美精品| 日韩免费高清| 精品视频一区二区三区在线观看 | 国产精品欧美日韩一区| 欧美特黄一级大片| 国产精品丝袜在线播放| 视频一区二区中文字幕| 亚洲精品极品| 日韩不卡免费视频| 在线精品亚洲| 亚洲精品一区二区妖精| 欧洲一级精品| 91看片一区| av资源亚洲| 国产精品久久久久久久免费观看 | 久久精品国产99国产| 久久人人99| 午夜影院欧美|