精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解 TypeScript 函數聲明和重載

開發 前端
在 JavaScript 中,函數是構建應用的一塊基石,我們可以使用函數抽離可復用的邏輯、抽象模型、封裝過程。在TypeScript中,函數仍然是最基本、最重要的概念之一。下面就來看看TypeScript中的函數類型是如何定義和使用的。

在 JavaScript 中,函數是構建應用的一塊基石,我們可以使用函數抽離可復用的邏輯、抽象模型、封裝過程。在TypeScript中,函數仍然是最基本、最重要的概念之一。下面就來看看TypeScript中的函數類型是如何定義和使用的。

一、函數類型定義

1. 直接定義

函數類型的定義包括對參數和返回值的類型定義:

  1. function add(arg1: number, arg2: number): number { 
  2.   return x + y; 
  3. const add = (arg1: number, arg2: number): number => { 
  4.   return x + y; 
  5. }; 

這里用function字面量和箭頭函數兩種形式定義了add函數。函數參數 arg1 和 arg2 都是數值類型,最后通過相加得到的結果也是數值類型。

如果在這里省略參數的類型,TypeScript 會默認這個參數是 any 類型;如果省略返回值的類型,如果函數無返回值,那么 TypeScript 會默認函數返回值是 void 類型;如果函數有返回值,那么 TypeScript 會根據定義的邏輯推斷出返回類型。

需要注意,在TypeScript中,如果函數沒有返回值,并且我們顯式的定義了這個函數的返回值類型為 undefined,那就會報錯:A function whose declared type is neither 'void' nor 'any' must return a value。正確的做法就是上面說的,將函數的返回值類型聲明為void:

  1. function fn(x: number): void { 
  2.  console.log(x) 

一個函數的定義包括函數名、參數、邏輯和返回值。為函數定義類型時,完整的定義應該包括參數類型和返回值類型。上面都是在定義函數的指定參數類型和返回值類型。下面來定義一個完整的函數類型,以及用這個函數類型來規定一個函數定義時參數和返回值需要符合的類型。

  1. let add: (x: number, y: number) => number; 
  2. add = (arg1: number, arg2: number): number => arg1 + arg2; 
  3. add = (arg1: string, arg2: string): string => arg1 + arg2; // error 

這里定義了一個變量 add,給它指定了函數類型,也就是(x: number, y: number) => number,這個函數類型包含參數和返回值的類型。然后給 add 賦了一個實際的函數,這個函數參數類型和返回類型都和函數類型中定義的一致,所以可以賦值。后面又給它賦了一個新函數,而這個函數的參數類型和返回值類型都是 string 類型,這時就會報如下錯誤:

  1. 不能將類型"(arg1: string, arg2: string) => string"分配給類型"(x: number, y: number) => number"。 
  2. 參數"arg1""x" 的類型不兼容。 
  3. 不能將類型"number"分配給類型"string"。 

注意: 函數中如果使用了函數體之外定義的變量,這個變量的類型是不體現在函數類型定義的。

2. 接口定義

使用接口可以清晰地定義函數類型。下面來使用接口為add函數定義函數類型:

  1. interface Add { 
  2.   (x: number, y: number): number; 
  3. let addAdd = (arg1: string, arg2: string): string => arg1 + arg2;  
  4. // error 不能將類型“(arg1: string, arg2: string) => string”分配給類型“Add” 

通過接口形式定義了函數類型,這個接口Add定義了這個結構是一個函數,兩個參數類型都是number類型,返回值也是number類型。當指定變量add類型為Add時,再要給add賦值,就必須是一個函數,且參數類型和返回值類型都要滿足接口Add,顯然這個函數并不滿足條件,所以報錯了。

3. 類型別名定義

可以使用類型別名來定義函數類型,這種形式更加直觀易讀:

  1. type Add = (x: number, y: number) => number; 
  2. let addAdd = (arg1: string, arg2: string): string => arg1 + arg2;  
  3. // error 不能將類型“(arg1: string, arg2: string) => string”分配給類型“Add” 

使用type關鍵字可以給任何定義的類型起一個別名。上面定義了 Add 這個別名后,Add就成為了一個和(x: number, y: number) => number一致的類型定義。上面定義了Add類型,指定add類型為Add,但是給add賦的值并不滿足Add類型要求,所以報錯了。

注意,這里的=>與 ES6 中箭頭函數的=>不同。TypeScript 函數類型中的=>用來表示函數的定義,其左側是函數的參數類型,右側是函數的返回值類型;而 ES6 中的=>是函數的實現。

二、函數參數定義

1. 可選參數

TypeScript 會在編寫代碼時就檢查出調用函數時參數中存在的一些錯誤:

  1. type Add = (x: number, y: number) => number; 
  2. let addAdd = (arg1, arg2) => arg1 + arg2; 
  3. add(1, 2);    // success 
  4. add(1, 2, 3); // error 應有 2 個參數,但獲得 3 個 
  5. add(1);       // error 應有 2 個參數,但獲得 1 個 

在JavaScript中,上面代碼中后面兩個函數調用都不會報錯, 只不過add(1, 2, 3)可以返回正確結果3,add(1)會返回NaN。而在TypeScript中我們設置了指定的參數,那么在使用該類型時,傳入的參數必須與定義的參數類型和數量一致。

但有時候,函數有些參數不是必須的,我們就可以將函數的參數設置為可選參數。可選參數只需在參數名后跟隨一個?即可:

  1. type Add = (x: number, y: number, z?: number) => number; 
  2. let addAdd = (arg1, arg2, arg3) => arg1 + arg2 + arg3; 
  3. add(1, 2);    // success   3 
  4. add(1, 2, 3); // success   6 

上面的代碼中,z是一個可選參數,那他的類型就是number | undefined,表示參數 z 就是可缺省的,那是不是意味著可缺省和類型是 undefined 等價呢?來看下面的例子:

  1. function log(x?: number) { 
  2.   console.log(x); 
  3. function log1(x: number | undefined) { 
  4.   console.log(x); 
  5. log(); 
  6. log(undefined); 
  7. log1();    // Expected 1 arguments, but got 0 
  8. log1(undefined); 

可以看到,第三次函數調用報錯了,這里的 ?: 表示在調用函數時可以不顯式的傳入參數。但是,如果聲明了參數類型為 number | undefined,就表示函數參數是不可缺省且類型必須是 number 或者 undfined。

需要注意,可選參數必須放在必選參數后面,這和在 JS 中定義函數是一致的。來看例子:

  1. type Add = (x?: number, y: number) => number;  // error 必選參數不能位于可選參數后。 

在TypeScript中,可選參數必須放到最后,上面把可選參數x放到了必選參數y前面,所以報錯了。在 JavaScript 中是沒有可選參數這個概念的,只不過在編寫邏輯時,可能會判斷某個參數是否為undefined,如果是則說明調用該函數的時候沒有傳這個參數,要做下兼容處理;而如果幾個參數中,前面的參數是可不傳的,后面的參數是需要傳的,就需要在該可不傳的參數位置傳入一個 undefined 占位才行。

2. 默認參數

在 ES6 標準出來之前,默認參數實現起來比較繁瑣:

  1. var count = 0; 
  2. function counter(step) { 
  3.   step = step || 1; 
  4.   count += step; 

上面定義了一個計數器增值函數,這個函數有一個參數 step,即每次增加的步長,如果不傳入參數,那么 step 接受到的就是 undefined,undefined 轉換為布爾值是 false,所以 step || 1 這里取了 1,從而達到了不傳參數默認 step === 1 的效果。

在 ES6 中,定義函數時給參數設默認值直接在參數后面使用等號連接默認值即可:

  1. const count = 0; 
  2. const counter = (step = 1) => { 
  3.   count += step; 
  4. }; 

當為參數指定了默認參數時,TypeScript 會識別默認參數的類型;當調用函數時,如果給這個帶默認值的參數傳了別的類型的參數則會報錯:

  1. const add = (x: number, y = 2) => { 
  2.   return x + y; 
  3. }; 
  4. add(1, "ts"); // error 類型"string"的參數不能賦給類型"number"的參數 

當然也可以顯式地給默認參數 y 設置類型:

  1. const add = (x: number, y: number = 2) => { 
  2.   return x + y; 
  3. }; 

注意:函數的默認參數類型必須是參數類型的子類型,如下代碼:

  1. const add = (x: number, y: number | string = 2) => { 
  2.   return x + y; 
  3. }; 

這里 add 函數參數 y 的類型為可選的聯合類型 number | string,但是因為默認參數數字類型是聯合類型 number | string 的子類型,所以 TypeScript 也會檢查通過。

3. 剩余參數

在 JavaScript 中,如果定義一個函數,這個函數可以輸入任意個數的參數,那么就無法在定義參數列表的時候挨個定義。在 ES6 發布之前,需要用 arguments 來獲取參數列表。arguments 是一個類數組對象,它包含在函數調用時傳入函數的所有實際參數,它還包含一個 length 屬性,表示參數個數。下面來模擬實現函數的重載:

  1. function handleData() { 
  2.   if (arguments.length === 1) return arguments[0] * 2; 
  3.   else if (arguments.length === 2) return arguments[0] * arguments[1]; 
  4.   else return Array.prototype.slice.apply(arguments).join("_"); 
  5. handleData(2); // 4 
  6. handleData(2, 3); // 6 
  7. handleData(1, 2, 3, 4, 5); // '1_2_3_4_5' 

這段代碼如果在TypeScript環境中執行,三次handleData的調用都會報錯,因為handleData函數定義的時候沒有參數。

在 ES6 中,加入了…拓展運算符,它可以將一個函數或對象進行拆解。它還支持用在函數的參數列表中,用來處理任意數量的參數:

  1. const handleData = (arg1, ...args) => { 
  2.   console.log(args); 
  3. }; 
  4. handleData(1, 2, 3, 4, 5); // [ 2, 3, 4, 5 ] 

在 TypeScript 中可以為剩余參數指定類型:

  1. const handleData = (arg1: number, ...args: number[]) => { 
  2.  
  3. }; 
  4. handleData(1, "a"); // error 類型"string"的參數不能賦給類型"number"的參數 

三、函數重載

在多數的函數中,是只能接受一組固定的參數。但是一些函數可以接收可變數量的參數、不同類型的參數,甚至可以根據調用函數的方式來返回不同類型的參數。要使用此類函數,TypeScript我們提供了函數重載功能。下面來看看函數重載是如何工作的。

1. 函數簽名

先來看一個簡單的例子:

  1. function greet(person: string): string { 
  2.   return `Hello, ${person}!`; 
  3.  
  4. greet('World'); // 'Hello, World!' 

這里的greet方法接收一個參數name,類型為string。那如果想讓greet方法來接收一組名稱怎么辦?那這時greet函數會接收字符串或字符串數組作為參數,并返回字符串或字符串數組。那該如何改造這個函數?主要有兩種方式:通過判斷參數類型來修改函數簽名

  1. function greet(person: string | string[]): string | string[] { 
  2.   if (typeof person === 'string') { 
  3.     return `Hello, ${person}!`; 
  4.   } else if (Array.isArray(person)) { 
  5.     return person.map(name => `Hello, ${name}!`); 
  6.   } 
  7.   throw new Error('error'); 
  8.  
  9. greet('World');          // 'Hello, World!' 
  10. greet(['TS''JS']);     // ['Hello, TS!''Hello, JS!'

這是最簡單直接的方式,但是在某些情況下,我們希望單獨定義調用函數的方式,這時就可以使用函數重載。

2. 函數重載

當修改函數簽名的方式比較復雜或者涉及到多種數據類型時,建議使用函數重載來完成。在函數重載中,我們需要定義重載簽名和實現簽名。重載函數簽名只定義函數的參數和返回值類型,并不會定義函數的正文。對于一個函數不同的調用方式,就可以有多個重載簽名。

下面來實現greet()函數的重載:

  1. // 重載簽名 
  2. function greet(person: string): string; 
  3. function greet(persons: string[]): string[]; 
  4.   
  5. // 實現簽名 
  6. function greet(person: unknown): unknown { 
  7.   if (typeof person === 'string') { 
  8.     return `Hello, ${person}!`; 
  9.   } else if (Array.isArray(person)) { 
  10.     return person.map(name => `Hello, ${name}!`); 
  11.   } 
  12.   throw new Error('error'); 

這里greet()函數有兩個重載簽名和一個實現簽名。每個重載簽名都描述了調用函數的一種方式。我們可以使用字符串參數或使用字符串參數數組來調用greet()函數。

現在就可以使用字符串或字符串數組的參數調用greet()):

  1. greet('World');          // 'Hello, World!' 
  2. greet(['TS''JS']);     // ['Hello, TS!''Hello, JS!'

在定義函數重載時,需要注意以下兩點:

(1)函數簽名是可以調用的

雖然上面我們定義了重載簽名和簽名方法,但是簽名實現時不能直接調用的,只有重載簽名可以調用:

  1. const someValue: unknown = 'Unknown'
  2. greet(someValue); 

這樣調用的話就會報錯:

  1. No overload matches this call. 
  2. Overload 1 of 2, '(person: string): string', gave the following error. 
  3.  Argument of type 'unknown' is not assignable to parameter of type 'string'
  4. Overload 2 of 2, '(persons: string[]): string[]', gave the following error. 
  5.   Argument of type 'unknown' is not assignable to parameter of type 'string[]' 

也就是說,即使簽名實現接收unknown類型的參數,但是我們不能直接給greet()方法來傳遞unknown類型的參數,參數只能是函數重載簽名中定義的參數類型。

(2)實現簽名必須是通用的

在實現簽名時,定義的數據類型需要是通用的,以包含重載簽名。假如我們把greet()方法的返回值類型定義為string,這時就會出問題了:

  1. function greet(person: string): string; 
  2. function greet(persons: string[]): string[]; 
  3.  
  4. function greet(person: unknown): string { 
  5.   // ... 
  6.   throw new Error('error'); 

此時string[]類型就會和string不兼容。所以,實現簽名的返回類型和參數類型都要包含所有重載簽名中的參數類型和返回值類型,保證是通用的。

3. 方法重載

除了常規函數外,類中的方法也可以過載,比如用重載方法greet()來實現一個類:

  1. class Greeter { 
  2.   message: string; 
  3.   
  4.   constructor(message: string) { 
  5.     this.message = message; 
  6.   } 
  7.   
  8.   greet(person: string): string; 
  9.   greet(persons: string[]): string[]; 
  10.  
  11.   greet(person: unknown): unknown { 
  12.     if (typeof person === 'string') { 
  13.       return `${this.message}, ${person}!`; 
  14.     } else if (Array.isArray(person)) { 
  15.       return person.map(name => `${this.message}, ${name}!`); 
  16.     } 
  17.     throw new Error('error'); 
  18.   } 

Greeter類中包含了greet()重載方法:這里面有兩個描述如何調用方法的重載簽名,以及包含其實現簽名。這樣我們就可以通過兩種方式調用hi.greet():

  1. const hi = new Greeter('Hi'); 
  2.   
  3. hi.greet('World');          // 'Hello, World!' 
  4. hi.greet(['TS''JS']);     // ['Hello, TS!''Hello, JS!'

 

責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2023-04-14 15:44:20

TypeScrip函數重載

2021-12-10 09:11:36

TypeScript 函數重載 TS 前端

2017-08-01 00:19:15

Javascript函數函數聲明

2025-06-27 06:42:01

2009-11-16 16:59:03

PHP構造函數

2022-02-28 08:17:24

重載函數JS前端

2016-10-11 13:32:50

函數式TypeScriptJavascript

2011-05-30 16:11:46

Javascript

2009-07-31 16:00:30

C#函數重載

2010-01-18 16:56:30

C++函數

2016-12-26 09:23:18

C++函數覆蓋

2009-12-22 16:36:38

WCF重載

2024-04-15 12:54:40

2016-09-30 09:43:17

JavascriptTypeScript函數式編程

2021-11-08 11:02:01

Go函數重載

2024-11-13 19:03:14

2021-06-28 08:01:57

JS 函數表達式函數聲明

2010-01-20 17:48:07

C++ 函數重載

2009-09-01 11:28:32

C#使用函數重載

2009-02-24 16:17:41

日期時間函數
點贊
收藏

51CTO技術棧公眾號

亚洲人与黑人屁股眼交| 五月婷婷狠狠操| 欧美 日韩 国产 在线| 亚洲精品男同| 国产一区二区三区在线观看网站| 五月婷婷六月丁香激情| 污影院在线观看| 久久日韩精品一区二区五区| 国产美女久久精品香蕉69| 欧美精品一级片| 久久av超碰| 日韩亚洲电影在线| 国产精品少妇在线视频| 新版中文在线官网| 国产欧美日韩视频一区二区 | 国产精品美女久久久久| 日韩欧美一区二区三区| 性做爰过程免费播放| 亚洲区小说区图片区| 韩国欧美国产一区| 欧美洲成人男女午夜视频| 天天天天天天天天操| 久久99蜜桃| 亚洲变态欧美另类捆绑| 日本中文字幕二区| 久久精品女人天堂av免费观看| 玉米视频成人免费看| 日本不卡一区二区三区视频| 成人精品在线播放| 九九国产精品视频| 国产成人欧美在线观看| 四虎永久在线精品| 亚洲不卡av不卡一区二区| 亚洲新中文字幕| 亚洲av成人片色在线观看高潮 | 噜噜噜久久亚洲精品国产品小说| 久久手机精品视频| 国产又大又粗又爽的毛片| 黑色丝袜福利片av久久| 日韩一区二区视频在线观看| av免费一区二区| 懂色aⅴ精品一区二区三区| 精品免费在线观看| 黄色一级片在线看| 青草在线视频| 亚洲尤物在线视频观看| 黄色网络在线观看| 麻豆av免费在线观看| 中文字幕精品一区二区精品绿巨人 | av亚洲精华国产精华精| 国产 高清 精品 在线 a| 国产三级精品在线观看| 狠狠色狠狠色综合系列| 国产日韩在线观看av| 中文字幕人妻一区二区三区视频| 丝袜亚洲另类欧美综合| 国产不卡av在线免费观看| 日韩在线观看第一页| 国产欧美69| 欧美一级黑人aaaaaaa做受| 日本系列第一页| 亚洲人成免费| 欧美亚洲视频一区二区| 精品黑人一区二区三区| 日日噜噜夜夜狠狠视频欧美人| 国产精品91久久久| 国产精品自拍第一页| 美女诱惑一区二区| 成人春色激情网| 国产男男gay体育生白袜| 国产原创一区二区| 97久久天天综合色天天综合色hd| 性一交一乱一透一a级| eeuss影院一区二区三区| 久久草.com| 高清国产福利在线观看| 中文字幕日韩精品一区| 国产片侵犯亲女视频播放| 国产白浆在线免费观看| 色一区在线观看| 中文字幕一区久久| 99re6热只有精品免费观看| 亚洲精品美女在线观看| 亚洲女优在线观看| 在线观看国产精品入口| 午夜精品在线视频| 最近中文字幕免费观看| 国产一区二区三区不卡在线观看 | 亚洲91精品在线| 波多野结衣在线电影| 国产综合久久久久久鬼色| 国产乱码精品一区二区三区卡 | 欧美高清在线视频观看不卡| 99热在线观看免费精品| 麻豆精品一区二区三区| 成人免费视频观看视频| 国产精品一级伦理| 亚洲最大成人网4388xx| 国产真人无码作爱视频免费| 欧美经典影片视频网站| 亚洲欧美制服丝袜| 欧美日韩在线国产| 久久午夜精品| 不卡一区二区三区视频| 国产裸舞福利在线视频合集| 亚洲国产一区二区三区青草影视 | 日本中文字幕在线免费观看| 久久精品国产免费看久久精品| 国产精品福利视频| 欧美一区二区三区| 欧美性20hd另类| 久久久久亚洲av片无码v| 欧美欧美黄在线二区| 欧美极品少妇xxxxⅹ裸体艺术| 中文字幕一二区| 91蜜桃免费观看视频| 精品一区二区三区毛片| 成人网ww555视频免费看| 欧美videos中文字幕| 污污视频网站在线免费观看| 新67194成人永久网站| 99电影网电视剧在线观看| 91女主播在线观看| 欧美视频免费在线| 久久偷拍免费视频| 亚洲一级影院| 91精品网站| 麻豆tv免费在线观看| 欧美性三三影院| brazzers精品成人一区| 国产视频一区三区| 国产乱码精品一区二区三区日韩精品 | 超级碰在线观看| 97久久中文字幕| 中文字幕在线亚洲| 亚洲高清视频免费观看| 91老师国产黑色丝袜在线| 黄色一级片在线看| gogo久久日韩裸体艺术| 久久久久久久激情视频| 精品人妻无码一区二区| 亚洲日穴在线视频| 九九九九九伊人| 婷婷综合伊人| 国产日韩在线看片| 国产原创视频在线观看| 欧美精品免费视频| 裸体武打性艳史| 国产精品一区二区黑丝| 中文字幕在线中文| 中文在线免费一区三区| 欧美激情一级精品国产| 国产91免费在线观看| 一级中文字幕一区二区| 农村末发育av片一区二区| 欧美日韩一区二区高清| 国产精品久久一区二区三区| 9765激情中文在线| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 96日本xxxxxⅹxxx17| 国产精品国产精品国产专区不蜜| 午夜久久久精品| 91精品国产91久久综合| 99视频在线播放| 九色porny丨入口在线| 亚洲跨种族黑人xxx| www.久久视频| 中文字幕一区二区三区视频| 精产国品一二三区| 99精品国产福利在线观看免费| 欧美一区二区三区在线免费观看| 成人av集中营| 欧美日韩高清区| 日本私人网站在线观看| 欧美丝袜丝交足nylons| 久久99久久99精品免费看小说| 国产精品18久久久久久久久 | 香港一级纯黄大片| 亚洲精品专区| 任我爽在线视频精品一| а天堂中文最新一区二区三区| 欧美贵妇videos办公室| 青青草av免费在线观看| 欧美视频中文一区二区三区在线观看 | 蜜桃精品一区二区三区| 91国内精品久久| 日本免费中文字幕在线| 精品国产露脸精彩对白| 日韩熟女一区二区| 亚洲丝袜制服诱惑| 国产精品无码电影| 极品少妇一区二区三区精品视频| 久艹视频在线免费观看| 国产日产精品一区二区三区四区的观看方式| 国产精品小说在线| 国产丝袜在线播放| 深夜精品寂寞黄网站在线观看| 韩国av电影在线观看| 欧美性猛交xxxxxxxx| 国产精品7777| 亚洲欧洲日产国产综合网| 亚洲国产无码精品| 国产盗摄精品一区二区三区在线| 情侣黄网站免费看| 国产综合久久| 一级特黄录像免费播放全99| 首页亚洲中字| 亚洲一区久久久| 日本精品另类| 久久久久久尹人网香蕉| 免费av网站在线看| 国产香蕉一区二区三区在线视频| 99在线精品视频免费观看20| 欧美无人高清视频在线观看| 日本在线小视频| 亚洲欧美偷拍卡通变态| 国产综合精品在线| 99re这里只有精品6| 欧美69精品久久久久久不卡| 免费成人美女在线观看.| 成人综合视频在线| 狠狠色综合网| 日本高清xxxx| 无码一区二区三区视频| 日本一区免费| 曰本一区二区三区视频| 国产在线精品一区| 538任你躁精品视频网免费| 成人黄色网免费| 国产精品久久久久久吹潮| 日韩免费高清在线观看| 色一区二区三区| 国语自产精品视频在线看抢先版图片| 国产一二区在线| 久久久av一区| 黄色av网站在线播放| 日韩视频在线免费观看| a中文在线播放| 一区二区日韩精品| 国产爆初菊在线观看免费视频网站| 精品伊人久久97| 免费在线国产| 一本大道久久加勒比香蕉 | 北条麻妃在线一区二区| 最新国产在线观看| 中文字幕欧美在线| 婷婷五月在线视频| 色老头一区二区三区| 免费黄网站在线| 久久色免费在线视频| 激情在线小视频| 久久高清视频免费| 日本动漫同人动漫在线观看| 欧美老少做受xxxx高潮| 黄色羞羞视频在线观看| 韩国三级电影久久久久久| 午夜欧美激情| 国产精品国产三级国产aⅴ浪潮| 中文.日本.精品| 91视频8mav| 中文字幕日韩高清在线| 久久伊人一区二区| 精品色999| 特级黄色录像片| 韩日成人在线| 欧美成人免费高清视频| 蜜桃av一区二区在线观看 | 91捆绑美女网站| 国产真人真事毛片视频| 亚洲欧美日韩小说| 国产精品suv一区二区69| 欧美日韩中文字幕综合视频| 中文字幕免费视频观看| 欧美精品久久一区| 狠狠人妻久久久久久综合麻豆| 亚洲精品一区二区三区婷婷月 | 欧美午夜18电影| 亚洲精品一区二区三区四区五区| 亚洲免费二区| 欧美日韩二三区| 麻豆视频观看网址久久| 国模私拍在线观看| 国产拍欧美日韩视频二区| 欧美三级免费看| 一本色道久久综合狠狠躁的推荐| 亚洲熟妇av乱码在线观看| 精品国产精品一区二区夜夜嗨 | 久久久久久久91| 日本免费一区二区三区四区| 91美女高潮出水| 亚洲自拍电影| 日本老太婆做爰视频| 在线综合亚洲| 天天色天天综合网| 97se狠狠狠综合亚洲狠狠| 精品一区二区在线观看视频| 亚洲成av人片在线| 又污又黄的网站| 亚洲国产精品视频在线观看| 蜜芽在线免费观看| 日韩美女免费线视频| 57pao国产一区二区| 亚洲成人网上| 国产美女精品| 国产高潮失禁喷水爽到抽搐| 国产精品免费av| 影音先锋在线国产| 日韩免费视频一区| 丝袜美腿美女被狂躁在线观看| 91av在线影院| 91久久精品无嫩草影院| 亚洲国产精品视频一区| 一本色道久久精品| 免费啪视频在线观看| 亚洲欧美自拍偷拍| 最好看的日本字幕mv视频大全| 亚洲精品在线电影| av网站免费在线观看| 国产免费成人av| 国内精品视频在线观看| 国产毛片视频网站| 国产69精品久久777的优势| 波多野结衣喷潮| 欧美在线播放高清精品| 青青草在线播放| 欧美国产高跟鞋裸体秀xxxhd| 亚洲日本中文| 中文字幕一区二区三区四区五区| 日韩精品五月天| 欧美丰满少妇人妻精品| 天天综合网 天天综合色| 亚洲AV无码精品色毛片浪潮| 欧美大尺度在线观看| 中文字幕综合| 亚洲天堂av免费在线观看| 日本伊人色综合网| 欧美 日韩 国产 成人 在线观看 | 无码人妻精品一区二区三区66| 95精品视频在线| 国产精品美女久久久久av爽| 亚洲黄页网在线观看| 白浆在线视频| 狠狠久久综合婷婷不卡| 国产深夜精品| 中文幕无线码中文字蜜桃| 色婷婷激情一区二区三区| 经典三级在线| 国产精品国产三级国产aⅴ浪潮| 精品一区二区三区中文字幕老牛| 国产一区视频免费观看| 欧美国产1区2区| 国产精品丝袜黑色高跟鞋| 久久影视免费观看| 午夜电影一区| 久久av综合网| 久久综合久久综合久久| 日本久久综合网| 这里只有精品丝袜| 95精品视频| 国产日韩av网站| 99久久精品免费看国产免费软件| 五月天婷婷综合网| 亚洲欧美精品中文字幕在线| 日本一区免费网站| 裸体裸乳免费看| 成人国产亚洲欧美成人综合网| 奇米影视第四色777| 亚洲午夜未满十八勿入免费观看全集 | 97精品人人妻人人| 丁香五六月婷婷久久激情| 国产黄在线看| 亚洲free嫩bbb| 伊人成人在线| 国产传媒国产传媒| 91精品国产综合久久久久| av第一福利在线导航| 日本不卡久久| 福利电影一区二区| 少妇高潮av久久久久久| 日韩亚洲精品视频| 精品欧美午夜寂寞影院| 国产区二区三区| 夜夜嗨av一区二区三区| 亚洲欧美日韩精品永久在线| 国产日韩欧美在线| 一本久道久久综合狠狠爱| 青青青视频在线播放| 亚洲国产精品悠悠久久琪琪| 丁香婷婷久久| 欧美在线观看www| 日韩一区欧美小说| 手机看片福利在线观看| 91精品视频在线| 日韩精品亚洲一区| 国产无遮挡裸体免费视频| 中文一区二区视频| 麻豆一区一区三区四区| 日韩中文字幕a| 色综合久久六月婷婷中文字幕| 成人免费网站在线观看视频|