精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美h版在线观看| 欧美视频久久久| 天堂美国久久| 日韩精品一区二区在线| 国产成人在线免费看| 九九在线视频| 国产裸体歌舞团一区二区| 久久久亚洲天堂| 在线观看亚洲大片短视频| 免费看日产一区二区三区| 欧美性xxxxx| 蜜桃视频成人在线观看| 日韩一区二区三区中文字幕| 韩国毛片一区二区三区| 欧美在线视频a| 一区二区成人免费视频| 九一精品国产| 亚洲第一男人天堂| 欧美特级aaa| 涩涩涩在线视频| 亚洲天堂av一区| 欧美亚洲免费高清在线观看 | 成年人视频在线观看免费| 国内精品视频一区二区三区八戒| 555www成人网| 久久久精品91| 婷婷综合久久| 国产一区二区三区在线免费观看| 最新版天堂资源在线| 四虎影视国产精品| 欧美亚洲禁片免费| 成年人黄色片视频| 黄色漫画在线免费看| 亚洲精品ww久久久久久p站| 亚欧精品在线| 搞黄视频免费在线观看| 91美女视频网站| 国产一区二区三区四区hd| 性欧美一区二区三区| 精品午夜久久福利影院| 国产日本欧美一区| 中文字幕理论片| 蜜臀久久久99精品久久久久久| 奇米影视亚洲狠狠色| 国产无遮挡呻吟娇喘视频| 亚洲黄页一区| 97在线看福利| 久久久全国免费视频| 国产精品激情| 欧美精品videosex性欧美| 清纯粉嫩极品夜夜嗨av| 伊人色**天天综合婷婷| 久久成人在线视频| 亚洲天堂黄色片| 欧美成人国产| 久久久久免费视频| 国产无遮挡免费视频| 精品999日本| 午夜精品99久久免费| 日韩免费av片| 美女被久久久| 国产精品久久久久国产a级| 欧美另类高清videos的特点| 日韩国产精品大片| 91精品国产自产在线老师啪 | 久草中文在线视频| 国产一区清纯| 69影院欧美专区视频| 成年人av网站| 精品一区二区在线视频| 97超碰人人看人人 | 精品国产一区二区三区四| 天堂影院一区二区| 成人国产精品一区二区| 亚洲国产成人一区二区| 91美女蜜桃在线| 亚洲v国产v| 很黄的网站在线观看| 亚洲欧美日韩在线播放| 人妻无码久久一区二区三区免费| 免费毛片b在线观看| 欧美主播一区二区三区| 蜜桃福利午夜精品一区| 99精品国产高清一区二区麻豆| 亚洲精品美女在线观看| 天堂在线中文视频| 最新精品国产| 人妖精品videosex性欧美| 中文字幕日韩经典| 懂色av一区二区三区蜜臀| 欧美高清性xxxxhdvideosex| 亚洲搞黄视频| 亚洲成av人片一区二区梦乃| 亚洲性生活网站| 伊人久久亚洲| 中文字幕日韩免费视频| 国产一级在线观看视频| 免费在线视频一区| 国产精品美女久久久久av福利| 无码国产伦一区二区三区视频| 中文字幕第一区综合| 免费人成自慰网站| 成人精品国产亚洲| 亚洲精品国产免费| 在线视频这里只有精品| 中文日韩欧美| 97超碰人人模人人爽人人看| www在线播放| 亚洲高清免费视频| 亚洲精品手机在线观看| 亚瑟一区二区三区四区| 久久99久久久久久久噜噜| 国产午夜无码视频在线观看| 成人黄色在线看| www亚洲国产| 国产精品久久亚洲不卡| 亚洲第五色综合网| 三级黄色免费观看| 美女黄网久久| 久久久久久欧美精品色一二三四| av在线下载| 欧美三级电影网| 手机免费看av| 国产精品美女| 国产精品一区二区欧美| 成人日批视频| 3d成人h动漫网站入口| 精品无码人妻一区二区免费蜜桃| 国产亚洲精品自拍| 国产亚洲一区在线播放| 欧美videossex另类| 欧美夫妻性生活| 任你操精品视频| 日本成人在线电影网| 免费成人看片网址| 亚洲女同志freevdieo| 欧美精品一区二区三区四区| 日本一区不卡| 色与欲影视天天看综合网| 欧美xxxxx少妇| 91tv官网精品成人亚洲| 国产精品黄色影片导航在线观看| 欧美一区二区在线观看视频| 一区二区免费在线播放| 欧美xxxxxbbbbb| 综合国产精品| 91亚洲一区精品| 黄色一级片在线观看| 欧美精品日韩精品| 日韩欧美国产成人精品免费| 久国产精品韩国三级视频| 亚洲欧美一区二区原创| 国产资源一区| 久久网福利资源网站| 国产精品毛片久久久久久久av| 国产精品久久久久久户外露出| 污污网站免费看| 亚洲国产成人精品女人| 99一区二区三区| 国产高清在线a视频大全| 亚洲精品一区二区三区蜜桃下载| 国产在线视频第一页| 99久久精品免费看国产| 国产精品秘入口18禁麻豆免会员| 五月综合久久| 国产精品久久久久久久美男| 生活片a∨在线观看| 欧美一区2区视频在线观看| 久久久久久久久久综合| 91丨九色丨蝌蚪富婆spa| 日av中文字幕| 久久久久久久久99精品大| 91原创国产| 亚洲性色av| 色老头一区二区三区| 精品人妻一区二区三区三区四区| 婷婷久久综合九色综合伊人色| 国产人妻一区二区| 久久激情综合网| 菠萝蜜视频在线观看入口| 亚洲精品国产setv| 成人黄色生活片| heyzo中文字幕在线| 亚洲图片欧洲图片av| 国产伦子伦对白视频| 欧美日韩国产精品一区二区三区四区| 亚洲av无码一区二区三区人| 国内国产精品久久| 免费看的黄色大片| 国产精品国产一区| 精品久久久久久一区二区里番| 国产原创一区| 91精品国产高清久久久久久91| av资源在线观看免费高清| 日韩三级中文字幕| 加勒比在线一区| 亚洲综合在线第一页| 91网站免费视频| 岛国精品在线观看| 在线观看国产一级片| aⅴ色国产欧美| 先锋影音男人资源| 久久99国内| 99精品国产高清在线观看| 亚洲精品国产嫩草在线观看| 久久99久久亚洲国产| 淫片在线观看| 日韩极品精品视频免费观看| 国产人妻精品一区二区三区| 色先锋资源久久综合| 久久免费播放视频| 国产精品高清亚洲| av黄色在线免费观看| 成人国产视频在线观看| 第一区免费在线观看| 久久久精品网| av免费观看国产| 亚洲欧美一区在线| 亚洲欧美日韩另类精品一区二区三区 | 欧美日韩在线影院| 亚洲成人生活片| 国产精品女上位| 一色道久久88加勒比一| 99久久精品国产麻豆演员表| 美女网站视频在线观看| 韩国成人在线视频| av免费一区二区| 日韩精品乱码免费| 亚洲 中文字幕 日韩 无码| 亚洲大片在线| 青春草国产视频| 午夜久久久久| 丰满人妻一区二区三区53号| 999久久久精品国产| 亚洲第一导航| 成人羞羞视频在线看网址| 区一区二区三区中文字幕| 日日天天久久| 蜜桃臀一区二区三区| 久9re热视频这里只有精品| 国产精品二区三区四区| 在线观看视频一区二区三区| 91精品网站| 天堂精品久久久久| 97在线中文字幕| 亚洲无线观看| 国产日韩欧美综合精品| 日韩在线黄色| 日本在线观看不卡| 日本欧美国产| 亚洲图色在线| 一个色综合网| 国产在线视频综合| 99精品欧美| 伊人成色综合网| 久久国产精品久久久久久电车| 男人天堂网视频| 日韩精品欧美成人高清一区二区| 一级特黄性色生活片| 久久精品国产一区二区| 1314成人网| 成人av高清在线| 成都免费高清电影| 国产精品美女久久久久久| 黄色录像一级片| 一区二区三区 在线观看视频| 精品视频久久久久| 欧美日韩在线视频一区二区| 中文字幕无线码一区| 欧美电影一区二区三区| 黄色av网站免费在线观看| 亚洲精品日韩丝袜精品| 91av资源在线| 色综合久久久久久中文网| 激情黄产视频在线免费观看| 国产精品久久77777| 精品国产三区在线| 精品国产一区二区三| 黄色不卡一区| av日韩在线看| 日韩精品视频网站| www.欧美com| 国产亚洲欧美日韩日本| 成人免费毛片东京热| 欧美天堂在线观看| 国产又爽又黄免费软件| 亚洲国产日韩精品在线| av中文字幕在线| 久久人人看视频| 青青草国产一区二区三区| 国产区二精品视| 欧美gay男男猛男无套| 国产一区二区网站| 在线亚洲精品| 五月婷婷狠狠操| 国产精品91xxx| 性久久久久久久久久 | 精品手机在线视频| 亚洲一区二区四区蜜桃| 中文字幕 国产精品| 日韩免费成人网| 自拍视频在线免费观看| 午夜精品久久久久久99热| 欧美爱爱视频| 免费国产一区二区| 欧美精品综合| 国产高潮免费视频| 91视频免费观看| 久草福利资源在线观看| 欧美日韩国产天堂| 完全免费av在线播放| 国产成人精品久久二区二区91 | 日本不卡不码高清免费观看| 99国产精品免费视频| 国产女人18水真多18精品一级做| 黄网站免费在线| 91精品麻豆日日躁夜夜躁| 可以免费看污视频的网站在线| 欧美极品第一页| 警花av一区二区三区| 亚洲高清视频在线观看| 翔田千里一区二区| 最新日本中文字幕| 亚洲免费毛片网站| 亚洲一区二区色| 亚洲视频日韩精品| 精品三级久久| 黄色91av| 极品少妇一区二区三区| 欧美老女人bb| 亚洲精品免费播放| 91丨porny丨在线中文 | 国产精品久久久视频| 精品免费在线视频| 秋霞av鲁丝片一区二区| 欧美高清视频在线观看| 精品一区视频| 天堂v在线视频| 精品一区二区三区日韩| 久久久久亚洲AV成人无在| 91黄色免费版| 国产区视频在线播放| 国产精品99久久99久久久二8| 免费电影一区二区三区| 国产成人亚洲精品无码h在线| 99re这里只有精品首页| 影音先锋亚洲天堂| 精品视频久久久久久久| 小视频免费在线观看| 久久久影院一区二区三区| 亚洲专区欧美专区| 实拍女处破www免费看| 日韩欧美一区视频| 国产中文字幕在线观看| 国产精品成人免费视频| 国产探花在线精品| 潘金莲激情呻吟欲求不满视频| 亚洲国产精品成人久久综合一区| 中文字幕一区二区三区四区免费看| 在线播放精品一区二区三区| 国产亚洲精品精品国产亚洲综合| 在线成人性视频| 国产一区日韩二区欧美三区| 丁香花五月激情| 亚洲国产欧美久久| 都市激情亚洲综合| 一区二区三区久久网| 激情欧美一区二区| 国产va在线播放| 亚洲电影av在线| 久久夜夜操妹子| 自拍偷拍亚洲色图欧美| 国产超碰在线一区| 久久久久99精品成人片三人毛片| 国产午夜精品全部视频在线播放 | 99视频在线免费观看| 国产精品久久久久久久免费软件| 波多野在线播放| 日韩精品一区二区三区视频| 日本不卡网站| 夜夜爽99久久国产综合精品女不卡 | 久久激情综合| 麻豆视频免费在线播放| 日韩欧美一区在线| 亚洲天堂av影院| 中文字幕一区二区三区四区五区六区| 国产一区91精品张津瑜| 狠狠躁夜夜躁人人爽天天高潮| 亚洲视屏在线播放| 精品一区二区三区中文字幕在线 | 在线免费观看成人| 国产91露脸合集magnet| 自拍偷拍18p| 欧美大片在线看免费观看| 欧美日韩播放| 亚洲精品乱码久久久久久9色| 欧美性猛交xxxx免费看漫画 | 中文字幕精品在线不卡| 男人的天堂a在线| 欧美日韩激情美女|