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

JavaScript Lazy evaluation:可迭代對象與迭代器

開發 前端
Lazy evaluation常被譯為“延遲計算”或“惰性計算”,指的是僅僅在真正需要執行的時候才計算表達式的值。

[[353766]]

本文已經過原作者 MelkorNemesis 授權翻譯。

Lazy evaluation

Lazy evaluation常被譯為“延遲計算”或“惰性計算”,指的是僅僅在真正需要執行的時候才計算表達式的值。

與惰性求值相反的是及早求值(eager evaluation)及早求值,也被稱為貪婪求值(greedy evaluation)或嚴格求值,是多數傳統編程語言的求值策略。

充分利用惰性求值的特性帶來的好處主要體現在以下兩個方面:

  • 避免不必要的計算,帶來性能上的提升。
  • 節省空間,使得無限循環的數據結構成為可能。

迭代器

ES6 中的迭代器使惰性求值和創建用戶定義的數據序列成為可能。迭代是一種遍歷數據的機制。迭代器是用于遍歷數據結構元素(稱為Iterable)的指針,用于產生值序列的指針。

迭代器是一個可以被迭代的對象。它抽象了數據容器,使其行為類似于可迭代對象。

迭代器在實例化時不計算每個項目的值,僅在請求時才生成下一個值。這非常有用,特別是對于大型數據集或無限個元素的序列。

可迭代對象

可迭代對象是希望其元素可被公眾訪問的數據結構。JS 中的很多對象都是可迭代的,它們可能不是很好的察覺,但是如果仔細檢查,就會發現迭代的特征:

  • new Map([iterable])
  • new WeakMap([iterable])
  • new Set([iterable])
  • new WeakSet([iterable])
  • Promise.all([iterable])
  • Promise.race([iterable])
  • Array.from([iterable])

還有需要一個可迭代的對象,否則,它將拋出一個類型錯誤,例如:

  • for ... of
  • ... (展開操作符)const [a, b, ..] = iterable (解構賦值)
  • yield* (生成器)

JavaScript中已有許多內置的可迭代項:

String,Array,TypedArray,Map,Set。

迭代協議

迭代器和可迭對象遵循迭代協議。

協議是一組接口,并規定了如何使用它們。

迭代器遵循迭代器協議,可迭代遵循可迭代協議。

可迭代的協議

要使對象變得可迭代,它必須實現一個通過Symbol.iterator的迭代器方法,這個方法是迭代器的工廠。

使用 TypeScript,可迭代協議如下所示:

  1. interface Iterable { 
  2.   [Symbol.iterator]() : Iterator; 

Symbol.iterator]()是無參數函數。在可迭代對象上調用它,這意味著我們可以通過this來訪問可迭代對象,它可以是常規函數或生成器函數。

迭代器協議

迭代器協議定義了產生值序列的標準方法。

為了使對象成為迭代器,它必須實現next()方法。迭代器可以實現return()方法,我們將在本文后面討論這個問題。

使用 TypeScript,迭代器協議如下所示:

  1. interface Iterator { 
  2.     next() : IteratorResult; 
  3.     return?(value?: any): IteratorResult; 

IteratorResult 的定義如下:

  1. interface IteratorResult { 
  2.     value?: any
  3.     done: boolean; 
  • done通知消費者迭代器是否已經被使用,false表示仍有值需要生成,true表示迭代器已經結束。
  • value 可以是任何 JS 值,它是向消費者展示的值。

當done為true時,可以省略value。

組合

迭代器和可以可迭代對象可以用下面這張圖來表示:

事例

基礎知識介紹完了,接著,我們來配合一些事例來加深我們的映像。

范圍迭代器

我們先從一個非常基本的迭代器開始,createRangeIterator迭代器。

我們手動調用it.next()以獲得下一個IteratorResult。最后一次調用返回{done:true},這意味著迭代器現在已被使用,不再產生任何值。

  1. function createRangeIterator(fromto) { 
  2.   let i = from
  3.  
  4.   return { 
  5.     next() { 
  6.       if (i <= to) { 
  7.         return { value: i++, done: false }; 
  8.       } else { 
  9.         return { done: true }; 
  10.       } 
  11.     } 
  12.   } 
  13.  
  14. const it = createRangeIterator(1, 3); 
  15.  
  16. console.log(it.next()); 
  17. console.log(it.next()); 
  18. console.log(it.next()); 
  19. console.log(it.next()); 

可迭代范圍迭代器

在本文的前面,我已經提到 JS 中的某些語句需要一個可迭代的對象。因此,我們前面的示例在與for ... of循環一起使用時將不起作用。

但是創建符合迭代器和可迭代協議的對象非常容易。

  1. function createRangeIterator (fromto) { 
  2.   let i = from 
  3.  
  4.   return { 
  5.     [Symbol.iterator] () { 
  6.       return this 
  7.     }, 
  8.     next() { 
  9.       if (i <= to) { 
  10.         return { value: i++, done: false } 
  11.       } else { 
  12.         return { done: true } 
  13.       } 
  14.     } 
  15.   } 
  16.  
  17. const it = createRangeIterator(1, 3) 
  18.  
  19. for (const i of it) { 
  20.   console.log(i) 

無限序列迭代器

迭代器可以表示無限制大小的序列,因為它們僅在需要時才計算值。

注意不要在無限迭代器上使用擴展運算符(...),JS 將嘗試消費迭代器,由于迭代器是無限的,因此它將永遠不會結束。所以你的應用程序將崩潰,因為內存已被耗盡 ??

同樣,for ... of 循環也是一樣的情況,所以要確保能退出循環:

  1. function createEvenNumbersIterator () { 
  2.   let value = 0 
  3.  
  4.   return { 
  5.     [Symbol.iterator] () { 
  6.       return this 
  7.     }, 
  8.     next () { 
  9.       value += 2 
  10.       return { value, done: false
  11.     } 
  12.   } 
  13.  
  14. const it = createEvenNumbersIterator() 
  15.  
  16. const [a, b, c] = it 
  17. console.log({a, b, c}) 
  18.  
  19. const [x, y, z] = it 
  20. console.log({ x, y, z }) 
  21.  
  22. for (const even of it) { 
  23.   console.log(even) 
  24.   if (even > 20) { 
  25.     break 
  26.   } 

關閉迭代器

前面我們提到過,迭代器可以有選擇地使用return()方法。當迭代器直到最后都沒有迭代時使用此方法,并讓迭代器進行清理。

for ... of循環可以通過以下方式更早地終止迭代:

  • break
  • continue
  • throw
  • return
  1. function createCloseableIterator () { 
  2.   let idx = 0 
  3.   const data = ['a''b''c''d''e'
  4.  
  5.   function cleanup() { 
  6.     console.log('Performing cleanup'
  7.   } 
  8.   return { 
  9.     [Symbol.iterator]() { return this }, 
  10.     next () { 
  11.       if (idx <= data.length - 1) { 
  12.         return { value: data[idx++], done: false } 
  13.       } else { 
  14.         cleanup() 
  15.         return { done: true } 
  16.       } 
  17.     }, 
  18.     return () { 
  19.       cleanup() 
  20.       return { done: true } 
  21.     } 
  22.   } 
  23.  
  24. const it = createCloseableIterator() 
  25.  
  26. for (const value of it) { 
  27.   console.log(value) 
  28.   if (value === 'c') { 
  29.     break 
  30.   } 
  31.  
  32. console.log('\n----------\n'
  33.  
  34. const _it = createCloseableIterator(); 
  35. for (const value of _it) { 
  36.   console.log(value); 

  • 如果知道迭代器已經結束,則手動調用cleanup()函數。
  • 如果突然完成,則return()起作用并為我們進行清理。

額外的內容

如果你已經做到了這一點,我們來看看一些額外的內容。

組合器

組合器是將現有可迭代對象組合在一起以創建新可迭代對象的函數。

因此,我們能夠創建許多實用函數。那map或者filter呢?看看下面的代碼,花一分鐘時間來理解它。

  1. function createEvenNumbersIterator() { 
  2.   let value = 0; 
  3.  
  4.   return { 
  5.     [Symbol.iterator]() { 
  6.       return this; 
  7.     }, 
  8.     next() { 
  9.       value += 2; 
  10.       return { value, done: false }; 
  11.     } 
  12.   } 
  13.  
  14. function map(fn, iterable) { 
  15.   const iter = iterable[Symbol.iterator](); 
  16.  
  17.   return { 
  18.     [Symbol.iterator]() { 
  19.       return this; 
  20.     }, 
  21.     next() { 
  22.       const n = iter.next(); 
  23.       if (!n.done) { 
  24.         return { value: fn(n.value), done: false }; 
  25.       } else { 
  26.         return { done: true }; 
  27.       } 
  28.     } 
  29.   } 
  30.  
  31. function filter(fn, iterable) { 
  32.   const iter = iterable[Symbol.iterator](); 
  33.  
  34.   return { 
  35.     [Symbol.iterator]() { 
  36.       return this; 
  37.     }, 
  38.     next() { 
  39.       const n = iter.next(); 
  40.       if (!n.done) { 
  41.         if (fn(n.value)) { 
  42.           return { value: n.value, done: false }; 
  43.         } else { 
  44.           return this.next(); 
  45.         } 
  46.       } else { 
  47.         return { done: true }; 
  48.       } 
  49.     } 
  50.   } 
  51.  
  52. function take(n, iterable) { 
  53.   const iter = iterable[Symbol.iterator](); 
  54.  
  55.   return { 
  56.     [Symbol.iterator]() { 
  57.       return this; 
  58.     }, 
  59.     next() { 
  60.       if (n > 0) { 
  61.         n--; 
  62.         return iter.next(); 
  63.       } else { 
  64.         return { done: true }; 
  65.       } 
  66.     } 
  67.   } 
  68.  
  69. function cycle(iterable) { 
  70.   const iter = iterable[Symbol.iterator](); 
  71.   const saved = []; 
  72.   let idx = 0; 
  73.    
  74.   return { 
  75.     [Symbol.iterator]() { 
  76.       return this; 
  77.     }, 
  78.     next() { 
  79.       const n = iter.next(); 
  80.       if (!n.done) { 
  81.         saved[idx++] = n.value; 
  82.         return { value: n.value, done: false }; 
  83.       } else { 
  84.         return { value: saved[idx++ % saved.length], done: false }; 
  85.       } 
  86.     } 
  87.   } 
  88.  
  89. function collect(iterable) { 
  90.   // consumes the iterator 
  91.   return Array.from(iterable); 
  92.  
  93. const evenNumbersIterator = createEvenNumbersIterator(); 
  94. const result = collect(                 // 7. and collect the result 
  95.   filter(                               // ⬆️ 6. keep only values higher than 1 
  96.     val => val > 1, map(                // ⬆️ 5. divide obtained values by 2 
  97.       val => val / 2, take(             // ⬆️ 4. take only six of them 
  98.         6, cycle(                       // ⬆️ 3. make an infinite cycling sequence of them 
  99.           take(                         // ⬆️ 2. take just three of them 
  100.             3, evenNumbersIterator      // ⬆️ 1. infinite sequence of even numbers 
  101.           ) 
  102.         ) 
  103.       ) 
  104.     ) 
  105.   ) 
  106. ); 
  107.  
  108. console.log(result); 

這是一大堆代碼,很快我們將看到如何使用生成器和函數式編程概念來重構所有這些內容。保持關注,并注意我的后續文章,我們仍然有很多內容要講。

作者:MelkorNemesis 譯者:前端小智 來源:medium

原文:https://medium.com/@MelrNemesis/javascript-lazy-evaluation-iterables-iterators-e0770a5de96f

本文轉載自微信公眾號「 大遷世界」,可以通過以下二維碼關注。轉載本文請聯系 大遷世界公眾號。

 

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2022-10-26 08:25:06

Python編程迭代器

2021-11-28 08:03:41

Python迭代器對象

2025-03-26 10:56:54

2021-09-03 10:00:00

JavaScript迭代對象

2024-11-14 13:15:22

JavaScript可迭代數組

2021-09-14 07:26:25

JavaScript迭代對象

2022-01-15 10:01:15

Javascript 高階函數前端

2017-06-26 16:26:15

Python迭代對象迭代器

2024-03-25 08:57:49

模塊迭代對象迭代器

2016-03-28 10:39:05

Python迭代迭代器

2022-10-24 13:02:38

2024-02-27 00:10:06

語言Javascript

2013-08-19 16:44:15

.Net

2009-12-15 14:58:19

Ruby迭代器

2011-07-13 13:56:06

STL迭代器

2023-03-01 00:07:32

JavaScript迭代器生成器

2022-10-26 09:27:59

Python編程迭代器協議

2020-11-06 09:01:46

迭代器模式

2009-08-26 16:26:37

C#迭代器模式

2009-08-11 13:59:41

迭代器模式C# Iterator
點贊
收藏

51CTO技術棧公眾號

超碰97在线播放| 中文字幕欧美国内| 任你操这里只有精品| 毛片免费在线播放| 蓝色福利精品导航| 久久99精品视频一区97| 野花社区视频在线观看| 四虎视频在线精品免费网址| 一二三区精品福利视频| 欧美久久久久久一卡四| 国产精品特级毛片一区二区三区| 黑丝一区二区| 一区二区成人av| 日本人妻一区二区三区| 精品国产第一福利网站| 亚洲视频在线一区观看| 久久久一本精品99久久精品| 综合久久中文字幕| 欧美日韩专区| 伊人亚洲福利一区二区三区| 美女扒开腿免费视频| 日本h片久久| 精品国产福利在线| 尤物国产精品| 亚洲av电影一区| 国产曰批免费观看久久久| 欧美中文在线视频| 日韩免费观看一区二区| 999国产精品999久久久久久| 亚洲男人第一av网站| www.四虎精品| 国产成年精品| 欧美人体做爰大胆视频| 老熟妇仑乱视频一区二区| 91色在线看| 一区二区三区四区激情| 亚州欧美一区三区三区在线| 香蕉国产在线视频| 成人免费视频播放| 444亚洲人体| 一级黄在线观看| 久久综合影视| 日本亚洲欧美成人| 可以在线观看av的网站| 一区福利视频| 欧美国产一区二区三区| 日日骚一区二区三区| 久久高清精品| 色偷偷av亚洲男人的天堂| 一区二区三区免费在线观看视频| 国产一区在线电影| 精品国精品国产| 亚洲宅男天堂在线观看无病毒 | av片在线观看| 亚洲欧美中日韩| 亚洲一区精品视频| jizz日韩| 国产精品久久毛片a| 欧美亚洲另类久久综合| 四虎影院在线播放| 久久亚区不卡日本| 欧美成人在线免费观看| 伦理片一区二区三区| 久久久美女艺术照精彩视频福利播放| 久久99久久99精品蜜柚传媒| 日本黄在线观看| 久久亚洲私人国产精品va媚药| 蜜桃日韩视频| 国产成人天天5g影院在线观看| 久久久久国产成人精品亚洲午夜| 日本不卡一区二区三区在线观看| www 日韩| 亚洲精品videosex极品| 9色porny| 成人亚洲欧美| 欧美日韩你懂得| 国产探花在线观看视频| 成人性生交大片免费看96| 亚洲娇小xxxx欧美娇小| 波多野结衣一本| 日韩专区精品| 久久久久久久999精品视频| 免费黄色网址在线| 日av在线不卡| 91久久精品www人人做人人爽 | 日韩黄色在线视频| 久久午夜视频| 成人a在线视频| 欧美一区,二区| 国产婷婷色一区二区三区| 伊甸园精品99久久久久久| 99在线视频影院| 欧美自拍丝袜亚洲| 97精品人人妻人人| 国产毛片一区二区三区 | 蜜桃成人在线| 日本网站在线免费观看视频| 亚洲国产综合在线| 99热手机在线| 亚洲三级av| 亚洲一级片在线看| 91在线播放观看| 久久久久久黄| av一区和二区| 3d成人动漫在线| 亚洲国产视频网站| 美女在线视频一区二区| 加勒比色综合久久久久久久久| 亚洲欧洲国产精品| 免费在线观看日韩| 麻豆国产精品一区二区三区| 国产精品一区二区你懂得| 大胆av不用播放器在线播放| 亚洲一区二区三区三| 日本激情综合网| 欧美天堂影院| 久久99亚洲精品| 日本成人一级片| av成人动漫在线观看| 国产高清免费在线| 免费观看成人性生生活片| 欧美哺乳videos| 青青青手机在线视频| 午夜亚洲伦理| 国产日韩二区| 午夜激情在线| 91超碰这里只有精品国产| 亚洲综合色一区| 99av国产精品欲麻豆| 亚洲最大福利网| eeuss影院www在线播放| 欧美性猛交xxxx免费看久久久| 中国男女全黄大片| 午夜精品久久久久久久四虎美女版| 日本国产欧美一区二区三区| 天天干天天插天天操| 一区二区高清视频在线观看| av中文字幕网址| 精品视频日韩| 国产成人在线一区二区| 欧美美乳在线| 日本国产一区二区| 美女久久久久久久久久| 亚洲欧美日韩国产综合精品二区| 国产在线一区二区三区欧美| 青草在线视频在线观看| 日韩一区二区免费视频| 国产一区二区精彩视频| 精品一区二区三区免费毛片爱| 婷婷久久伊人| 国产91在线播放精品| 亚洲色图综合久久| 国产又粗又猛又爽又| 久久伊人蜜桃av一区二区| 黑人糟蹋人妻hd中文字幕| 日韩av黄色在线| 欧美中文字幕视频| 国产在线观看精品一区| 在线国产亚洲欧美| 国产在线免费av| 韩国一区二区视频| 99精品一级欧美片免费播放| 欧美片网站免费| 久久91精品国产| 亚洲第一精品网站| 亚洲电影在线免费观看| 狠狠人妻久久久久久综合蜜桃| 日韩视频在线一区二区三区 | 爽成人777777婷婷| 成人精品久久一区二区三区| 中国av在线播放| 亚洲黄色成人网| 国产精品21p| 日本一区二区三区免费乱视频| 手机视频在线观看| 在线成人直播| 国产一区二区三区四区hd | 成人国产精品一区二区| 成人影院www在线观看| 日韩欧美国产高清| 国产精品免费一区豆花| www毛片com| 国产精品你懂的| 永久av免费在线观看| 好看的日韩av电影| 清纯唯美一区二区三区| **日韩最新| 久久久久国产一区二区三区| 毛片免费在线观看| 91麻豆精品国产91久久久久| 日韩少妇裸体做爰视频| 中文一区在线播放| 欧美69精品久久久久久不卡| 亚洲欧美春色| 日本道在线视频| 伊人久久大香线蕉综合网站| 成人免费视频网址| 乡村艳史在线观看| 久久夜精品va视频免费观看| 亚洲欧美日韩动漫| 欧美人妇做爰xxxⅹ性高电影 | 欧美人成网站| 欧美日韩免费观看一区| 国产专区精品| 国产91在线高潮白浆在线观看| caoporn免费在线| 亚洲欧美在线免费| 亚洲精品久久久久久久久久久久久久 | 日韩黄色影视| 日韩不卡在线视频| 国产精品黄页免费高清在线观看| 欧洲黄色一区| 日韩在线观看免费高清完整版| 天堂中文在线资| 日韩欧美久久久| 亚洲天堂2021av| 欧美视频在线免费看| 久久99久久98精品免观看软件| 久久久噜噜噜久噜久久综合| 中文字幕一区二区三区乱码不卡| 久久66热re国产| 国产aaaaa毛片| 性伦欧美刺激片在线观看| 日本wwwcom| 91tv精品福利国产在线观看| 亚欧精品在线| 一级日韩一级欧美| 亚洲免费播放| 日本精品免费视频| 色婷婷色综合| 日韩福利影院| 美女毛片一区二区三区四区最新中文字幕亚洲| 成人国产精品色哟哟| 久久精品超碰| 国产精品一区二区三区久久| 国产精品伦理| 茄子视频成人在线| 伊人久久综合一区二区| 8x拔播拔播x8国产精品| 大黄网站在线观看| 欧美激情videoshd| 人交獸av完整版在线观看| 欧美成人精品在线| 中日韩高清电影网| 欧美大尺度激情区在线播放| 1769免费视频在线观看| 久久夜色精品国产欧美乱| 精品视频在线一区二区| 久久久精品国产| 成人免费网址| 欧美成人精品不卡视频在线观看| gogo在线观看| 久久久噜噜噜久久| av中文字幕在线看| 欧美性在线视频| sis001欧美| 国产精品精品视频一区二区三区| 日韩一区二区三区免费| 国产精品天天狠天天看| 日韩av黄色| 电影午夜精品一区二区三区| 国产精品玖玖玖在线资源| 午夜精品成人在线视频| 成人一区二区三区仙踪林| 国产mv日韩mv欧美| 理论片大全免费理伦片| 久久婷婷综合激情| 在线观看国产精品一区| 国产精品久久网站| 国产一区二区视频在线观看免费| 亚洲午夜影视影院在线观看| 亚洲伊人成人网| 欧美亚洲日本国产| 国产日韩欧美视频在线观看| 精品久久久久久亚洲综合网| 亚洲av成人无码网天堂| 在线电影欧美日韩一区二区私密| 欧美一区二区三区在线观看免费| 欧美大尺度激情区在线播放| 色是在线视频| 国产日韩欧美夫妻视频在线观看| 国产中文欧美日韩在线| 久久99精品久久久久久久青青日本 | 91免费看片在线| 欧美激情久久久久久久久久久| 天堂精品视频| 国产一区二区三区四区老人| 日本a级片免费观看| 奇米色一区二区三区四区| 性鲍视频在线观看| 久久久久久**毛片大全| 免费看一级大片| 欧美日韩午夜剧场| 国产又粗又猛又黄又爽| 亚洲精品久久久久久久久久久久| aaa在线免费观看| 欧美精品第一页在线播放| 91精品国产66| 国产日韩欧美一区二区| 日产精品一区二区| 丰满少妇久久久| 国产在线视视频有精品| 欧洲女同同性吃奶| 亚洲综合清纯丝袜自拍| 真实新婚偷拍xxxxx| 亚洲第一级黄色片| 秋霞a级毛片在线看| 欧美亚洲日本网站| 日韩在线视频一区二区三区| 视频在线99re| 国产精品一国产精品k频道56| 午夜视频在线观| 国产午夜精品一区二区| 久久精品久久国产| 91精品国产综合久久精品图片 | 777av视频| 国产美女一区二区三区| 亚洲天堂岛国片| 欧美日韩免费在线观看| 国产黄a三级三级三级| 中文字幕亚洲在线| 吞精囗交69激情欧美| 国产女主播一区二区| 中文字幕免费精品| 久久这里只精品| 国产午夜精品理论片a级大结局| 国产第100页| 日韩你懂的在线播放| 免费**毛片在线| 国产精品一区二区久久| 国产a久久精品一区二区三区| 久激情内射婷内射蜜桃| 国产999精品久久久久久绿帽| 午夜爽爽爽男女免费观看| 欧美揉bbbbb揉bbbbb| 国产中文在线视频| 国产suv精品一区二区| 久久精品66| 狠狠97人人婷婷五月| 成人动漫在线一区| 精品小视频在线观看| 日韩精品一区二区三区在线播放| а√资源新版在线天堂| 91日本在线视频| 中文乱码免费一区二区三区下载| 欧美一级特黄aaa| 亚洲欧美日韩成人高清在线一区| 一女二男一黄一片| 久久精品国产久精国产一老狼| 精品久久99| 一区二区精品在线| 国产在线精品一区在线观看麻豆| 日韩欧美综合视频| 欧美电影免费提供在线观看| 午夜伦理在线视频| 国产一区二区三区四区五区在线| 99精品国产在热久久| theav精尽人亡av| 色婷婷av一区二区三区软件| 黄色片免费在线| 国产精品美女在线| 性欧美欧美巨大69| 能看毛片的网站| 亚洲大片在线观看| 国产在线色视频| 国产伦精品免费视频| 综合久久亚洲| 北京富婆泄欲对白| 在线观看91精品国产入口| 91九色在线porn| 99国产高清| 亚洲一卡久久| 人与动物性xxxx| 日韩欧美中文字幕精品| 国产拍在线视频| 四虎影视永久免费在线观看一区二区三区 | 欧美日本高清一区| 夜夜春成人影院| 奇米视频888| 亚洲国产中文字幕在线视频综合| 天堂在线观看视频| 国产精品久久一区| 午夜精品影院| 日本少妇色视频| 欧美日韩国产综合视频在线观看 | 欧美系列电影免费观看| 亚洲黄色片免费看| 欧美性色xo影院| 91cn在线观看| 欧美日韩喷水| 国产91在线观看| aaa在线视频| 欧美日韩福利电影| 久久不见久久见国语| 久久精品无码一区二区三区毛片| 疯狂欧美牲乱大交777| 免费在线观看黄色网| 蜜桃狠狠色伊人亚洲综合网站| 国产在线视频不卡二| 亚洲 欧美 日韩 在线|