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

用 TypeScript 實現斐波那契數列

開發 前端
如果之前學過 C++ 或者 Java 之類的語言,對泛型一定不陌生,泛型可以讓我們定義函數參數的時候不指定參數類型,用一個占位符代替,當運行的時候再由外界傳過來的類型決定。

[[432333]]

前幾天在知乎看到一篇文章,用 TypeScript 類型運算實現一個中國象棋程序 :

邊看邊 woc,TypeScript 不是一個類型系統嗎,咋還實現象棋了,感覺發現了新大陸一樣,然后把大佬的代碼 clone下來,本地「運行」了一下,只能是帶引號的運行了,因為 TS就是動態推導類型,只需要安裝相關插件,鼠標 hover 上去就可以看到結果了。

看到這種神奇魔法,于是自己就查了查這是為什么。

圖靈完備

這是接觸到的第一個概念,維基百科是這樣定義的:

一個計算系統可以計算任何圖靈-可計算函數,被稱作圖靈完全(或者圖靈完備)?;蛘呷魏慰梢阅M通用圖靈機的系統。

可計算函數粗暴的理解為「人能計算的問題」,而現在例如 C++、JAVA幾乎所有編程語言都是具有圖靈完備性的,關于圖靈完備是一個更大的問題,更通俗的解釋可以看 什么是圖靈完備?知乎這篇回答,很有意思。

https://www.zhihu.com/question/20115374/answer/288346717

還了解到了一門有趣的編程語言 —— 1993 年Urban Müller 發明的Brainfuck 語言,感受一下它怎么打印 Hello World。

  1. +++++ +++++             initialize counter (cell #0) to 10 
  2. [                       use loop to set 70/100/30/10 
  3.     > +++++ ++              add  7 to cell #1 
  4.     > +++++ +++++           add 10 to cell #2 
  5.     > +++                   add  3 to cell #3 
  6.     > +                     add  1 to cell #4 
  7. <<<< -                  decrement counter (cell #0) 
  8. > ++ .                  print 'H' 
  9. > + .                   print 'e' 
  10. +++++ ++ .              print 'l' 
  11. .                       print 'l' 
  12. +++ .                   print 'o' 
  13. > ++ .                  print ' ' 
  14. << +++++ +++++ +++++ .  print 'W' 
  15. > .                     print 'o' 

是的,你沒有看錯,左邊是代碼,右邊是注釋,這里有運行的單句執行圖示,可以感受一下:

http://fatiherikli.github.io/brainfuck-visualizer/

上邊的紙帶代表內存中的情況,然后通過左移右移加加減減,最終輸出了 Hello world!。

而在 TypeScript 倉庫的一個 issues 中也討論過 TypeScript 的圖靈完備了,作者還分享了一個判斷是否是質數的代碼,也很有意思。

TypeScript 相關知識

為了實現文章的標題 「用 TypeScript 實現斐波那契數列」,需要先學習下相關的知識點。

泛型

如果之前學過 C++ 或者 Java 之類的語言,對泛型一定不陌生,泛型可以讓我們定義函數參數的時候不指定參數類型,用一個占位符代替,當運行的時候再由外界傳過來的類型決定。

舉個簡單的例子,實現兩個元素相加,如果用 TypeScript 限制的話,即使是相同的邏輯也要寫多次了。

  1. function addTwoNumber(a: number, b: number):number { 
  2.   return a + b; 
  3.  
  4. function addTwoNumberString(a: string, b: string):string { 
  5.   return a + b; 
  6.  
  7. addTwoNumber(1,3) 
  8. addTwoNumberString('1''2'); 

不然的話就只能 anyScript 了,完全失去了類型校驗。

  1. function addTwoNumber(a: any, b: any):any { 
  2.   return a + b; 
  3.  
  4. addTwoNumber(1,3) 
  5. addTwoNumber('1''2'); 
  6.  
  7. addTwoNumber('1', 2); //不報錯 

如果有泛型的話,就既可以達到邏輯的復用,同時對類型進行校驗。

  1. function addTwoNumber<T>(a: T, b: T): T { 
  2.   return <any>a + <any>b; //這里需要強制轉換下,不然會報 Operator '+' cannot be applied to types 'T' and 'T'.ts(2365) 
  3.  
  4. addTwoNumber(1, 3); 
  5. addTwoNumber("1""3"); 
  6.  
  7. addTwoNumber('1', 2); //報錯 

當然上邊有強行用泛型的嫌疑了,不過能大體理解泛型的作用就好,哈哈。上邊的情況用 TS 的重載會更好些。

類型 type

TS 中除了基本的類型,number、string 、number[] 等,比較特殊的地方 1 、abc 、true 也可以單獨算一個類型。1 的類型是 1,當然也屬于 number。

最重要的是 TS 允許我們定義新的類型,而且我們還可以通過泛型變量,進行類型的運算然后產生新的類型。舉幾個例子:

  1. type Type1<T> = T extends number ? number : string; 
  2. type Type2 = Type1<2121>; // 此時 Type2 就相當于 number 
  3. type Type3 = Type1<{}>; // 此時 Type3 就相當于 string 

exstends 和后邊的 ? 構成了一個三元表達式,如果 extends 前面的類型能夠賦值給 extends 后面的類型,那么表達式判斷為真,否則為假。

因為單個數字也是一個類型,所以我們就可以判斷傳入的 T 是否等于某個數。

  1. type Type4<T> = T extends 1 ? true : false
  2. type Type5 = Type4<2121>; // 此時 Type5 就相當于 false 類型 
  3. type Type6 = Type4<1>; // 此時 Type6 就相當于 true 類型 

可以仔細體會一下這里,很關鍵,后邊寫斐波那契數列的時候,一不小心就會被繞進去,因為我們是在操控類型之間的運算,和平時的編程感覺很不一樣。

一句話總結,每個類型可以看成一個函數,傳入的泛型是函數參數,并且也是一個類型,最后再返回一個新的類型。

  1. Type(type, type) => type 

infer

infer 表示在 extends 條件語句中待推斷的類型變量。

簡單理解,我們是為了判斷某個類型是否 extends 某個「結構」,但結構中參數的類型我們并不知道,此時我們寫一個 infer R(R只是占位,任何名字都可以),在類型推導的時候,R 就是當前類型真正的參數類型。舉個例子:

我們判斷 T 是否是 {a: XXX, b: XXX}的類型,因為 T 是泛型,我們并不知道T 中的 a 是什么類型,此時就可以用 infer 占位。當傳入具體的類型是就可以拿到 a 是什么類型了。

  1. type Foo<T> = T extends { a: infer U; b: infer U } ? U : never; 
  2.  
  3. type T1 = Foo<{ a: string; b: string }>; // T1 類型為 string 
  4. type T2 = Foo<{ a: string; b: number }>; // T2 類型為 string | number 

斐波那契數列

斐波那契數列就不多解釋了,先用 js 實現一個斐波那契數列。

  1. function Fibonacci(n) { 
  2.   if (n === 1) { 
  3.     return 1; 
  4.   } 
  5.   if (n === 2) { 
  6.     return 1; 
  7.   } 
  8.   return Fibonacci(n - 1) + Fibonacci(n - 2); 

最關鍵的遞歸不用擔心,TS 支持類型的遞歸定義,我們先寫一個大概的雛形,看象棋直接用中文定義類型挺有意思,這里也直接中文了。之前總結的那句話這里再加深一下,每個類型可以看成一個函數,傳入的泛型是函數參數,并且也是一個類型,最后再返回一個新的類型。

我們先定義「斐波那契」類型,泛型是傳入一個數字(這里的數字是當作類型),先判斷傳入的類型是否是 1 或者 2,然后直接返回 1 類型。

  1. type 斐波那契<某數 extends number> = 某數 extends 1  
  2.   ? 1 
  3.   : 某數 extends 2 
  4.   ? 1 
  5.   : 相加<斐波那契<減一<某數>>, 斐波那契<減一<減一<某數>>>>; 

: 相加<斐波那契<減一<某數>>, 斐波那契<減一<減一<某數>>>>;

上邊需要注意的是 <> 里邊的 extends 是為了限定傳入的類型,和外邊的 extends 不一樣。

我們還需要定義一個「相加」類型和一個「減一」類型。

相加是兩個類型相加,但是類型系統是不支持數字直接相加的,1 + 2 并不能直接相加,這里有個 trick。

數組類型和 js 中的數組一樣,同樣擁有 length 屬性,返回一個具體的數字類型,也支持擴展運算符。舉個例子:

  1. type A = [anyanyany
  2. type B = A["length"] // B 就是 3 類型 

所以我們可以將數字轉為數組,操作數組,然后再將數組通過 length 轉回數字。

先寫一個得到對應數組的 Type,這里就需要用到遞歸了。

  1. type 得到長度<數組 extends any[]> = 數組["length"]; 
  2.  
  3. type 轉為數組< 
  4.   某數 extends number, 
  5.   對應數組 extends any[] = [] // 默認值賦一個空數組,外部調用的時候不需要傳 
  6. > = 得到長度<對應數組> extends 某數 // 長度是否等于了需要的長度 
  7.   ? 對應數組 // 如果長度等于所需要的了就返回 
  8.   : 轉為數組<某數, [any, ...對應數組]>; // 否則再添加一個元素進入數組,然后遞歸調用 

: 轉為數組<某數, [any, ...對應數組]>; // 否則再添加一個元素進入數組,然后遞歸調用

有了轉為數組的的 Type,相加方法就很好寫了,我們只需要將兩個數先轉為對應的數組,將兩個數組連接,最后返回連接后的數組長度即可。

  1. type 相加<某數甲 extends number, 某數乙 extends number> = 得到長度< 
  2.   [...轉為數組<某數甲>, ...轉為數組<某數乙>] 
  3. >; 

然后定義減一的方法,也就是數組長度減 1,這里就利用到了 infer,還需要利用數組的解構。

  1. type 數組減一<某數組類型 extends any[]> = (( 
  2.   ...參數: 某數組類型 
  3. ) => any) extends (拆一個元素: any, ...剩下的數組: infer 剩下的數組類型) => any 
  4.   ? 剩下的數組類型 
  5.   : []; 

我們定義了一個函數類型,通過函數參數的解構,使得剩下的數組少了一個元素。

有了「數組減一」的類型,數字「減一」就水到渠成了,將數字轉為對應數組,數組減去一個元素,然后恢復為數字即可。

  1. type 減一<某數 extends number> = 得到長度<數組減一<轉為數組<某數>>>; 

整體代碼就出來了:

  1. type 斐波那契<某數 extends number> = 某數 extends 1 
  2.   ? 1 
  3.   : 某數 extends 2 
  4.   ? 1 
  5.   : 相加<斐波那契<減一<某數>>, 斐波那契<減一<減一<某數>>>>; 
  6.  
  7. type 得到長度<數組 extends any[]> = 數組["length"]; 
  8.  
  9. type 轉為數組< 
  10.   某數 extends number, 
  11.   對應數組 extends any[] = [] 
  12. > = 得到長度<對應數組> extends 某數 
  13.   ? 對應數組 
  14.   : 轉為數組<某數, [any, ...對應數組]>; 
  15.  
  16. type 相加<某數甲 extends number, 某數乙 extends number> = 得到長度< 
  17.   [...轉為數組<某數甲>, ...轉為數組<某數乙>] 
  18. >; 
  19.  
  20. type 數組減一<某數組類型 extends any[]> = (( 
  21.   ...參數: 某數組類型 
  22. ) => any) extends (拆一個元素: any, ...剩下的數組: infer 剩下的數組類型) => any 
  23.   ? 剩下的數組類型 
  24.   : []; 
  25.  
  26. type 減一<某數 extends number> = 得到長度<數組減一<轉為數組<某數>>>; 
  27.  
  28. // 測試 
  29. type 斐波那契八 = 斐波那契<8> 

看下結果:

不過到斐波那契 11 就因為遞歸層度太深 gg 了。

這里主要就是體驗下 TS 的圖靈完備,優化就不考慮了。

總結

 

通過寫一個這個例子對 TS 的類型有了更多的了解,但平時開發肯定不會這樣搞,主要是寫著玩哈哈,畢竟一個簡單的斐波那契數列都寫的這么麻煩,引用 Linus Torvalds 自傳的書名結束吧,Just for Fun!

 

責任編輯:武曉燕 來源: windliang
相關推薦

2021-05-16 18:02:52

系統編程JavaScript

2012-02-22 10:14:44

Java

2021-12-28 07:20:44

斐波那契數算法數字

2021-03-15 06:04:47

斐波那契數列背包問題算法

2020-05-11 14:18:14

JavaScript斐波那契數列遞歸

2021-10-22 08:22:37

線程Smt內核

2023-06-13 06:51:15

斐波那契數算法

2021-05-08 08:28:38

Java數據結構算法

2022-03-28 15:15:15

神經網絡編程開發

2022-11-14 08:12:34

2024-03-25 08:00:00

C++遞歸函數

2021-03-17 08:37:23

算法性能分析遞歸算法遞歸樹

2013-04-10 10:58:19

LambdaC#

2020-04-20 11:09:18

Python開發語言

2012-02-22 14:12:08

算法

2022-06-27 19:19:26

算法題青蛙跳臺階

2013-09-02 10:05:06

C編程語言

2020-11-23 08:53:34

堆Heap

2022-09-14 15:24:57

typescript快排

2022-09-05 08:06:49

數據結構Java
點贊
收藏

51CTO技術棧公眾號

一区二区三区四区视频免费观看| 91露出在线| 日韩视频一区| 在线电影中文日韩| 香蕉视频1024| 成人黄色免费短视频| 亚洲免费在线看| 狼狼综合久久久久综合网| 中文字幕人妻丝袜乱一区三区| dy888亚洲精品一区二区三区| 国产美女视频91| 欧美亚洲视频在线看网址| 99久久久无码国产精品不卡| 国产成人精品亚洲线观看| 欧美色综合久久| 国产真人做爰毛片视频直播| 三区四区电影在线观看| 91在线丨porny丨国产| 成人激情黄色网| 蜜臀精品一区二区三区| 成功精品影院| 欧美丝袜丝交足nylons| 久久黄色片视频| 国产黄色小视频在线| 久久久久久久久久久久久女国产乱| 91精品久久久久久蜜桃| 91精品人妻一区二区三区果冻| 日韩视频久久| 久久久久久国产精品久久| 制服丨自拍丨欧美丨动漫丨| 视频一区中文| 日韩精品在线电影| 中文字幕乱视频| 91探花在线观看| 中文字幕在线观看不卡视频| 欧美三级华人主播| 涩涩视频免费看| 亚洲激情亚洲| 另类专区欧美制服同性| 欧美激情视频二区| 国产精品嫩模av在线| 日韩成人免费视频| 人妻体内射精一区二区三区| 精品视频一区二区三区| 7777精品伊人久久久大香线蕉| 中文字幕一区综合| h视频在线播放| 国产三级精品在线| 欧美久久电影| 神马电影在线观看| 久久嫩草精品久久久精品一| 国产一区精品视频| 天堂在线资源库| www.成人网.com| 国产丝袜不卡| 欧美精品在线一区| 丁香婷婷综合五月| 日韩精品丝袜在线| 亚洲av无码一区东京热久久| 中文字幕区一区二区三| 日韩亚洲欧美中文三级| 四虎国产精品免费| av资源中文在线| 亚洲一区二区三区爽爽爽爽爽| 在线观看污视频| 天天综合网天天综合| 丁香桃色午夜亚洲一区二区三区| 99久久综合狠狠综合久久止| 亚洲精品97久久中文字幕无码 | 色综合男人天堂| 中文字幕天堂av| 中文在线综合| 亚洲精品wwwww| 伊人网在线视频观看| 国产精品美女久久久久久不卡| 国产亚洲xxx| 亚洲精品电影院| 伊人情人综合网| 欧美猛男性生活免费| 国产在线视频卡一卡二| 久久亚洲欧洲| 成人午夜黄色影院| 日本高清视频免费观看| 久久精品人人爽人人爽| 国产精品h视频| 高清电影在线观看免费| 色网综合在线观看| 肉色超薄丝袜脚交| 欧美自拍一区| 色偷偷亚洲男人天堂| 妺妺窝人体色www聚色窝仙踪| 日韩一级欧洲| 国产精品一区二区3区| 精品人妻av一区二区三区| 91在线国产福利| 亚洲欧美日产图| h片在线免费| 欧美性极品xxxx做受| 亚洲一区精品视频在线观看| 欧美激情极品| 一区二区三区精品99久久 | 户外极限露出调教在线视频| 国产在线精品一区二区不卡了| 97久草视频| 黄色av免费在线观看| 亚洲综合色丁香婷婷六月图片| 国产99久久九九精品无码| 黄页网站在线| 欧美色视频一区| 中文字幕无码人妻少妇免费| 成人短片线上看| 亚洲色图校园春色| 久久久久亚洲av无码专区体验| 日本欧美国产| 性欧美视频videos6一9| 国产无套在线观看| 毛片基地黄久久久久久天堂| 国产精品久久久久久婷婷天堂| 亚洲国产一二三区| 国产精品色眯眯| 国产成人精品视频免费看| 91精品一区| 亚洲视频欧洲视频| 日韩熟女精品一区二区三区| 极品少妇xxxx偷拍精品少妇| 欧洲国产精品| 成人好色电影| 精品国产91久久久| 亚洲性图第一页| 婷婷综合网站| 国产精品三级久久久久久电影| 日本不卡视频一区二区| 亚洲午夜久久久| 91精品国产高清91久久久久久 | 91香蕉视频在线| 国产一区二区三区小说| 欧美日本三级| 北条麻妃久久精品| 国产一区二区自拍视频| 欧美激情中文不卡| 91精品无人成人www| 久久av免费看| 日本免费久久高清视频| 日本大臀精品| 色哟哟在线观看一区二区三区| 又黄又色的网站| 欧美三级免费| 国产91精品一区二区绿帽| 中文在线字幕免费观看| 日韩欧美一区二区视频| xxxx黄色片| 国产精品chinese| 成人动漫在线视频| ****av在线网毛片| 亚洲高清不卡av| 色婷婷在线影院| 性欧美xxxx大乳国产app| 国产一区在线免费| 欧美男男tv网站在线播放| 亚洲精品二三区| av一级在线观看| 日本一区二区三区免费乱视频 | 亚洲精品福利免费在线观看| 国产精品老女人| 久久亚洲影视婷婷| 日本a√在线观看| 欧美黄色大片在线观看| 亚洲一区二区在线| bl视频在线免费观看| 日韩大陆欧美高清视频区| 最新中文字幕一区| 国产精品色婷婷| 手机看片国产精品| 国产精品日韩久久久| 日韩一本精品| 久久国产精品美女| 欧美一级免费看| aⅴ在线视频男人的天堂| 欧美高清激情brazzers| 欧美三级免费看| ww久久中文字幕| 日韩肉感妇bbwbbwbbw| 一区二区三区四区电影| 国产三区精品| 99久久er| 久久久久久久久久国产精品| 免费在线超碰| 91精品国产黑色紧身裤美女| 久久夜靖品2区| 国产欧美精品一区aⅴ影院| 精品人妻人人做人人爽夜夜爽| 欧美亚洲一级| 国产人妻互换一区二区| 极品束缚调教一区二区网站 | 国产亚洲女人久久久久毛片| 亚洲午夜精品一区| 中文久久精品| 欧美日韩亚洲国产成人| 亚洲欧洲色图| 爱情岛论坛亚洲入口| 国模视频一区| 国模视频一区二区| 蜜芽在线免费观看| 亚洲精品国产成人| 国产黄色片网站| 色婷婷久久99综合精品jk白丝| 日韩女优一区二区| 国产亚洲精品精华液| jjzz黄色片| 久99久精品视频免费观看| 欧美亚洲国产成人| 一区二区三区午夜视频| 色播五月综合| 日本韩国欧美超级黄在线观看| 91精品在线影院| 欧美一区 二区 三区| 久久久噜噜噜久久久| 久操视频在线免费播放| 亚洲天堂一区二区三区| 日本xxxxwww| 日韩一区二区免费视频| 在线免费看91| 色天天综合久久久久综合片| 日韩成年人视频| 一区二区三区欧美在线观看| 国产三级黄色片| 久久久久88色偷偷免费| 好吊色视频一区二区三区| 国产电影一区二区三区| 污视频网址在线观看| 日韩精彩视频在线观看| 99999精品视频| 亚洲免费观看| 日日碰狠狠添天天爽超碰97| 国产精品v一区二区三区| 国产传媒欧美日韩| 国产在线一区不卡| 国内精品小视频在线观看| a级毛片免费观看在线| xxx成人少妇69| 18免费在线视频| 中文字幕欧美视频在线| 国产精品老熟女视频一区二区| 日本韩国欧美三级| 久久久久久无码精品大片| 亚洲日本乱码在线观看| 亚洲a∨无码无在线观看| 欧美国产日韩一二三区| 久久久久久久毛片| 国产盗摄一区二区三区| 久久久久亚洲av无码专区首jn| 国产一区高清在线| 日批视频在线看| 国产激情一区二区三区桃花岛亚洲| 天美一区二区三区| 懂色av一区二区三区蜜臀| 欧美肉大捧一进一出免费视频| 不卡视频免费播放| 天堂久久久久久| 久久九九久精品国产免费直播| 成人黄色免费网址| 国产精品女人毛片| 最新一区二区三区| 亚洲国产精品久久久男人的天堂| 日本一级黄色录像| 色成年激情久久综合| 中文字幕在线播放av| 7777精品伊人久久久大香线蕉经典版下载| 国产精品嫩草影院精东| 日韩久久精品一区| 婷婷亚洲一区二区三区| 一区二区三区 在线观看视| 高潮毛片在线观看| 国精产品一区一区三区有限在线| 松下纱荣子在线观看| 国产精品久久久久不卡| 国产精品一区二区三区www| 国产精品视频福利| 欧美热在线视频精品999| 亚洲图色在线| 好看的日韩av电影| 欧美国产日韩在线播放| 国产精品综合久久| 自拍偷拍一区二区三区四区| 国内精品国产三级国产a久久| 极品白嫩的小少妇| 国产日韩三级在线| 国产精品老熟女一区二区| 岛国精品视频在线播放| 亚洲手机在线观看| 亚洲精品一区二区三区福利 | 中文字幕一区图| 日韩欧美一区二区视频在线播放| 综合久久一区| 四虎永久在线精品无码视频| 国产精品资源站在线| 爱爱免费小视频| 一区二区三区蜜桃网| 久久午夜鲁丝片| 欧美精品一区二区三区很污很色的 | 亚洲视频sss| 亚洲精品美女| 中文字幕第三区| 欧美激情综合网| 少妇一级淫片免费放中国| 在线不卡中文字幕播放| 暖暖视频在线免费观看| 欧美大片欧美激情性色a∨久久| jizz久久久久久| 久久久亚洲综合网站| 欧美另类专区| 国产永久免费网站| 久久久精品蜜桃| 日本熟妇毛耸耸xxxxxx| 在线观看91精品国产麻豆| 蝌蚪视频在线播放| 午夜精品美女自拍福到在线| 99热这里有精品| 五月天亚洲综合情| 午夜一区二区三区不卡视频| 26uuu国产| 日韩毛片在线免费观看| 四虎影视一区二区| 欧美性高潮在线| 日本免费一区视频| 久久久免费观看视频| 天堂va在线高清一区| 一区二区日本伦理| 免费av成人在线| 国产123在线| 在线看不卡av| 一个人看的www日本高清视频| 日韩第一页在线| 国产丝袜视频在线播放| 69174成人网| 中文精品久久| 婷婷中文字幕在线观看| 国产精品色噜噜| 在线观看亚洲一区二区| 在线观看久久久久久| 日韩中文在线播放| 日韩精品伦理第一区| 视频一区二区三区入口| 特级西西www444人体聚色 | 国产熟女精品视频| 欧美大胆一级视频| 超碰porn在线| 99国产高清| 欧美日本久久| 国产精品九九视频| 欧美性20hd另类| 欧洲亚洲在线| 国产精品久久久久久久久男| 精品国产一区二区三区久久久蜜臀| 免费大片在线观看| 国产欧美一区二区精品仙草咪| 国产一级片免费视频| 中文字幕一精品亚洲无线一区| 成人在线视频观看| 最新黄色av网站| 国产成+人+日韩+欧美+亚洲| 国产精品成人久久| 亚洲欧美激情视频| 欧美91在线|欧美| 黄色网zhan| 成人av免费在线| 国产性生活视频| 色多多国产成人永久免费网站| www欧美在线观看| 日本精品久久久久久久久久| 91麻豆免费视频| 中文字幕精品一区二| 欧美精品免费在线观看| 欧美激情极品| 午夜国产福利在线观看| 亚洲一区二区视频在线观看| 婷婷在线免费观看| 国产精品欧美激情| 午夜精品婷婷| 麻豆av免费观看| 3d动漫精品啪啪1区2区免费| 超级碰碰不卡在线视频| 日韩精品伦理第一区| 国产a精品视频| 久操视频在线免费观看| 久久夜精品香蕉| 性欧美xxxx免费岛国不卡电影| 欧美男女交配视频| 亚洲一区二区三区中文字幕在线 | 亚洲三区欧美一区国产二区| 天天夜碰日日摸日日澡性色av| 国产精品乱码一区二区三区软件| 午夜精品久久久久久久99热黄桃 | www.成人| 国产精品亚洲二区在线观看| 亚洲蜜臀av乱码久久精品| 日本一区视频| 97自拍视频| 男人操女人的视频在线观看欧美 | 在线观看网站黄不卡|