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

12種JavaScript中最常用的數組操作整理匯總

開發 前端
數組是最常見的數據結構之一,我們需要絕對自信地使用它。在這里,我將列出 JavaScript 中最重要的幾個數組常用操作片段,包括數組長度、替換元素、去重以及許多其他內容。

數組是最常見的數據結構之一,我們需要絕對自信地使用它。在這里,我將列出 JavaScript 中最重要的幾個數組常用操作片段,包括數組長度、替換元素、去重以及許多其他內容。

1、數組長度

大多數人都知道可以像這樣得到數組的長度:

const arr = [1, 2, 3]; 
console.log(arr.length); // 3

有趣的是,我們可以手動修改長度。這就是我所說的:

const arr = [1, 2, 3]; 
arr.length = 2; 
arr.forEach(i => console.log(i)); // 1 2

甚至創建指定長度的新數組:

const arr = []; 
arr.length = 100; 
console.log(arr) // [undefined, undefined, undefined ...]

這不是一個很好的實踐,但是值得了解。

我們常常需要清空數組時候會使用:

const arr = [1, 2]; 
arr.length = 0; 
console.log(arr)  // []

如果 arr 的值是共享的,并且所有參與者都必須看到清除的效果,那么這就是你需要采取的方法。

但是,JavaScript 語義規定,如果減少數組的長度,則必須刪除新長度及以上的所有元素。

而且這需要花費時間(除非引擎對設置長度為零的特殊情況進行了優化)。實際上,一個性能測試表明,在所有當前的 JavaScript 引擎上,這種清除方法更快。

2、替換數組元素

有幾種方法可以解決這個問題。如果需要替換指定索引處的元素,請使用 splice:

const arr = [1, 2, 3]; 
arr.splice(2, 1, 4); // 將索引 2 開始的 1 元素更改為 4
console.log(arr); // [1, 2, 4] 
arr.splice(0, 2, 5, 6) // 將索引 0 開始的 2 個元素更改為 5 和 6 
console.log(arr); // [5, 6, 4]

splice 在數組刪除有更多的說明

如果你需要根據項目的內容替換項目,或者必須創建一個新數組,請使用 map:

const arr = [1, 2, 3, 4, 5, 6]; 
// 所有奇數的平方
const arr2 = arr.map(item => item % 2 == 0 ? item : item*item); 
console.log(arr2); // [1, 2, 9, 4, 25, 6];

map 接受函數作為其參數。它將對數組中的每個元素調用該函數一次,并生成一個新的函數返回的項數組。

關于 map 有個經典的面試題:['1', '2', '3', '4', '5'].map(parseInt) => ?

3、過濾數組

在某些情況下,你需要刪除數組中的某些元素,然后創建一個新的元素。在這種情況下,使用在ES5中引入的很棒的 filter 方法:

const arr = [1, 2, 3, 4, 5, 6, 7]; 
// 過濾掉所有奇數
const arr2 = arr.filter(item => item % 2 == 0); 
console.log(arr2); // [2, 4, 6];

filter 的工作原理與 map 非常相似。向它提供一個函數,filter 將在數組的每個元素上調用它。如果要在新數組中包含此特定元素,則函數必須返回 true,否則返回 false。

4、 合并數組

如果你想將多個數組合并為一個數組,有兩種方法。

Array 提供了 concat 方法:

const arr1 = [1, 2, 3]; 
const arr2 = [4, 5, 6]; 
const arr3 = arr1.concat(arr2);
console.log(arr3 ); // [1, 2, 3, 4, 5, 6]

ES6 中引入了 spread operator,一種更方便的方法:

const arr1 = [1, 2, 3]; 
const arr2 = [4, 5, 6]; 
const arr3 = [...arr1, ...arr2];
console.log(arr3 ); // [1, 2, 3, 4, 5, 6]

還有一種比較奇特方法:

const arr1 = [1, 2, 3]; 
const arr2 = [4, 5, 6]; 
Array.prototype.push.apply(arr1, arr2);
console.log(arr1); // [1, 2, 3, 4, 5, 6]

上面 2 種通用的方法,都不會改變原數組,最后一種奇特方法,會改變 push 的原數組,謹慎使用。

Array.prototype.push.apply 和 concat 對比:

  • 數據上萬情況下,兩者性能相差毫秒個位數級別
  • Array.prototype.push.apply 數組長度有限制,不同瀏覽器不同,一般不能超過十萬, concat 無限制
  • Array.prototype.push.apply 會改變原數組, concat 不會

正常情況下我們都應該使用 concat 和 spread operator,有種情況下可以使用,如果頻繁合并數組可以用 Array.prototype.push.apply。

5、復制數組

總所周知,定義數組變量存儲不是數組值,而只是存儲引用。 這是我的意思:

const arr1 = [1, 2, 3]; 
const arr2 = arr1; 
arr2[0] = 4; 
arr2[1] = 2; 
arr2[2] = 0; 
console.log(arr1); // [4, 2, 0]

因為 arr2 持有對 arr1 的引用,所以對 arr2 的任何更改都是對 arr1 的更改。

const arr1 = [1, 2, 3]; 
const arr2 = arr1.slice(0); 
arr2[0] = 4; 
arr2[1] = 2; 
arr2[2] = 0;
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [4, 2, 0]

我們也可以使用 ES6 的 spread operator:

const arr1 = [1, 2, 3]; 
const arr2 = [...arr1]; 
arr2[0] = 4; 
arr2[1] = 2; 
arr2[2] = 0;
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [4, 2, 0]

也可以使用前面合并使用的 concat 方法

const arr1 = [1, 2, 3]; 
const arr2 = [].concat(arr1); 
arr2[0] = 4; 
arr2[1] = 2; 
arr2[2] = 0;
console.log(arr1); // [1, 2, 3]
console.log(arr2); // [4, 2, 0]

注意:如果想要了解更多的數組復制,請查詢 數組深拷貝和淺拷貝 相關資料,這里只實現了淺拷貝。

6、數組去重

數組去重是面試經常問的,數組去重方式很多,這里介紹比較簡單直白的三種方法:

可以使用 filter 方法幫助我們刪除重復數組元素。filter 將接受一個函數并傳遞 3 個參數:當前項、索引和當前數組。

const arr1 = [1, 1, 2, 3, 1, 5, 9, 4, 2]; 
const arr2 = arr1.filter((item, index, arr) => arr.indexOf(item) == index);
console.log(arr2); // [1, 2, 3, 5, 9, 4]

可以使用 reduce 方法從數組中刪除所有重復項。然而,這有點棘手。reduce 將接受一個函數并傳遞 2 個參數:數組的當前值和累加器。

累加器在項目之間保持相同,并最終返回:

const arr1 = [1, 1, 2, 3, 1, 5, 9, 4, 2]; 
const arr2 = arr1.reduce(
  (acc, item) =>  acc.indexOf(item) == -1 ? [...acc, item]: acc,
  []   // 初始化當前值
);
console.log(arr2); // [1, 2, 3, 5, 9, 4]

可以使用 ES6 中引入的新數據結構 set 和 spread operator:

const arr1 = [1, 1, 2, 3, 1, 5, 9, 4, 2]; 
const arr2 = [...(new Set(arr1))]; 
console.log(arr2); // [1, 2, 3, 5, 9, 4]

還有很多其他去重方式,比如使用 {} + for。

7、轉換為數組

有時我們必須將一些其它數據結構,如集合或字符串轉換為數組。

類數組:函數參數,dom 集合

Array.prototype.slice.call(arguments);
Array.prototype.concat.apply([], arguments);

字符串:

console.log('string'.split('')); // ["s", "t", "r", "i", "n", "g"]
console.log(Array.from('string'));  // ["s", "t", "r", "i", "n", "g"]

集合:

console.log(Array.from(new Set(1,2,3))); // [1,2,3]
console.log([...(new Set(1,2,3))]); // [1,2,3]

8、數組遍歷

數組遍歷方式很多,有底層的,有高階函數式,我們就來介紹幾種:

for:

const arr = [1, 2, 3]; 
for (let i = 0; i < arr.length; i++) { 
  console.log(arr[i]); 
} 
// 1 2 3

for-in:

const arr = [1, 2, 3]; 
for (let i in arr) {
   if(arr.hasOwnProperty(i)) {
      console.log(arr[i]); 
  }
} 
// 1 2 3

for-of:

const arr = [1, 2, 3]; 
for (let i of arr) {
  console.log(i); 
} 
// 1 2 3

forEach:

[1, 2, 3].forEach(i => console.log(i))
// 1 2 3

while:

const arr = [1,2,3];
let i = -1;
const length = arr.length;
while(++i < length) {
    console.log(arr[i])
}
// 1 2 3

迭代輔助語句:break 和 continue

  • break 語句是跳出當前循環,并執行當前循環之后的語句
  • continue 語句是終止當前循環,并繼續執行下一次循環

上面方式中,除了 forEach 不支持跳出循環體,其他都支持。高階函數式方式都類似 forEach 。

性能對比:

while > for > for-of > forEach > for-in

如果是編寫一些庫或者大量數據遍歷,推薦使用 while。有名的工具庫 lodash 里面遍歷全是 while。正常操作,for-of 或者 forEach 已經完全滿足需求。

下面介紹幾種高級函數式,滿足條件為 true 立即終止循環,否則繼續遍歷到整個數組完成的方法:

// ES5
[1, 2, 3].some((i) => i == 1);
// ES6
[1, 2, 3].find((i) => i == 1);
[1, 2, 3].findIndex((i) => i == 1);

其他高階函數式方法,例如 forEach map filter reduce reduceRight every sort 等,都是把整個數組遍歷。

9、扁平化多維數組

這個功能說不是很常用,但是有時候又會用到:

二維數組:

const arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
const arr2 = [].concat.apply([], arr1);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

三維數組:

const arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]];
const arr2 = [].concat.apply([], arr1);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 9, [1, 2, 3], [4, 5, 6], [7, 8, 9]]

concat.apply 方式只能扁平化二維數組,在多了就需要遞歸操作。

function flatten(arr) {
  return arr.reduce((flat, toFlatten) => {
    return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
  }, []);
}
const arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]];
const arr2 = flatten(arr1);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]

ES6+(ES2019) 給我們提供一個 flat 方法:

const arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
const arr2 = arr1.flat();
console.log(arr2); // [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

默認只是扁平化二維數組,如果想要扁平化多維,它接受一個參數 depth,如果想要展開無限的深度使用 Infinity:

const arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]];
const arr2 = arr1.flat(Infinity);
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]

還有一種面試扁平化二維數組方式:

const arr1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [[1, 2, 3], [4, 5, 6], [7, 8, 9]]];
const arr2 = arr1.toString().split(',').map(n => parseInt(n, 10));
console.log(arr2); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]

10、數組添加

如何從數組中添加元素?

我們可以使用 push 從數組末尾添加元素,使用 unshift 從開頭添加元素,或者使用 splice 從中間添加元素。concat 方法可創建帶有所需項目的新數組,這是一種添加元素的更高級的方法。

從數組的末尾添加元素:

const arr = [1, 2, 3, 4, 5, 6];
arr.push(7)
console.log( arr ); // [1, 2, 3, 4, 5, 6, 7]

從數組的開頭添加元素:

const arr = [1, 2, 3, 4, 5, 6];
arr.unshift(0)
console.log( arr ); // [0, 1, 2, 3, 4, 5, 6]

push 方法的工作原理與 unshift 方法非常相似,方法都沒有參數,都是返回數組更新的 length 屬性。它修改調用它的數組。

使用 splice 添加數組元素:

只需要把 splice,第二個參數設為 0 即可,splice 在數組刪除有更多的說明

const arr = [1, 2, 3, 4, 5];
arr.splice(1, 0, 10)
console.log(arr); // [1, 10, 2, 3, 4, 5]

使用 concat 添加數組元素:

const arr1 = [1, 2, 3, 4, 5];
const arr2 = arr1.concat(6);
console.log(arr2); // [1, 2, 3, 4, 5, 6]

11、數組刪除

數組允許我們對值進行分組并對其進行遍歷。 我們可以通過不同的方式添加和刪除數組元素。 不幸的是,沒有簡單的 Array.remove 方法。

那么,如何從數組中刪除元素?

除了 delete 方式外,JavaScript 數組還提供了多種清除數組值的方法。

我們可以使用 pop 從數組末尾刪除元素,使用 shift 從開頭刪除元素,或者使用 splice 從中間刪除元素。

filter 方法可創建帶有所需項目的新數組,這是一種刪除不需要的元素的更高級的方法。

從數組的末尾刪除元素:

通過將 length 屬性設置為小于當前數組長度,可以從數組末尾刪除數組元素。 索引大于或等于新長度的任何元素都將被刪除。

const arr = [1, 2, 3, 4, 5, 6];
arr.length = 4; 
console.log( arr ); // [1, 2, 3, 4]

pop 方法刪除數組的最后一個元素,返回該元素,并更新length屬性。pop 方法會修改調用它的數組,這意味著與使用 delete 不同,最后一個元素被完全刪除并且數組長度減小。

const arr = [1, 2, 3, 4, 5, 6];
arr.pop(); 
console.log( arr ); // [1, 2, 3, 4, 5]

從數組的開頭刪除元素:

shift 方法的工作原理與 pop 方法非常相似,只是它刪除了數組的第一個元素而不是最后一個元素。

const arr = [1, 2, 3, 4, 5, 6];
arr.shift(); 
console.log( arr ); // [2, 3, 4, 5, 6]

shift 和 pop 方法都沒有參數,都是返回已刪除的元素,更新剩余元素的索引,并更新 length 屬性。它修改調用它的數組。如果沒有元素,或者數組長度為 0,該方法返回 undefined。

使用 splice 刪除數組元素:

splice 方法可用于從數組中添加、替換或刪除元素。

splice 方法接收至少三個參數:

  • start:在數組中開始刪除元素的位置
  • deleteCount:刪除多少個元素(可選)
  • items...:添加元素(可選)

splice 可以實現添加、替換或刪除。

刪除:

如果 deleteCount 大于 start 之后的元素的總數,則從 start 后面的元素都將被刪除(含第 start 位)。

如果 deleteCount 被省略了,或者它的值大于等于array.length - start(也就是說,如果它大于或者等于start之后的所有元素的數量),那么start之后數組的所有元素都會被刪除。

如果 deleteCount 是 0 或者負數,則不移除元素。這種情況下,至少應添加一個新元素。

const arr1 = [1, 2, 3, 4, 5];
arr1.splice(1);   
console.log(arr1); // [1];
const arr2 = [1, 2, 3, 4, 5];
arr2.splice(1, 2) 
console.log(arr2); // [1, 4, 5]
const arr3 = [1, 2, 3, 4, 5];
arr3.splice(1, 1) 
console.log(arr3); // [1,3, 4, 5]

添加:

添加只需要把 deleteCount 設置為 0,items 就是要添加的元素。

const arr = [1, 2, 3, 4, 5];
arr.splice(1, 0, 10)
console.log(arr); // [1, 10, 2, 3, 4, 5]

替換:

添加只需要把 deleteCount 設置為和 items 個數一樣即可,items 就是要添加的元素。

const arr = [1, 2, 3, 4, 5];
arr.splice(1, 1, 10)
console.log(arr); // [1, 10, 3, 4, 5]

注意:splice 方法實際上返回兩個數組,即原始數組(現在缺少已刪除的元素)和僅包含已刪除的元素的數組。如果循環刪除元素或者多個相同元素,最好使用倒序遍歷。

使用 delete 刪除單個數組元素:

使用 delete 運算符不會影響 length 屬性。它也不會影響后續數組元素的索引。數組變得稀疏,這是說刪除的項目沒有被刪除而是變成 undefined 的一種奇特的方式。

const arr = [1, 2, 3, 4, 5];
delete arr[1]
console.log(arr); // [1, empty, 3, 4, 5]

實際上沒有將元素從數組中刪除的原因是 delete 運算符更多的是釋放內存,而不是刪除元素。 當不再有對該值的引用時,將釋放內存。

使用數組 filter 方法刪除匹配的元素:

與 splice 方法不同,filter 創建一個新數組。

filter 接收一個回調方法,回調返回 true 或 false。返回 true 的元素被添加到新的經過篩選的數組中。

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
const filtered = arr.filter((value, index, arr) => value > 5);
console.log(filtered); // [6, 7, 8, 9]
console.log(arr); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

清除或重置數組:

最簡單和最快的技術是將數組變量設置為空數組

let arr = [1,2,3];
arr = [];

清除數組的一個簡單技巧是將其 length 屬性設置為 0。

let arr = [1,2,3];
arr.length = 0;

使用 splice 方法,不傳遞第二個參數。這將返回原始元素的一個副本,這對于我們的有些場景可能很方便。也是一種數組復制方法技巧。

let arr = [1,2,3];
arr.splice(0);

使用 while 循環,這不是一種常用清除數組的方法,但它確實有效,而且可讀性強。一些性能測試也顯示這是最快的技術。

const arr = [1, 2, 3, 4, 5, 6];
while (arr.length) { arr.pop(); }
console.log(arr); // []

12、其他方法

剔除假值:

[1, false, '', NaN, 0, [], {}, '123'].filter(Boolean) // [1, [], {}, '123']

是否有一個真值:

[1, false, '', NaN, 0, [], {}, '123'].some(Boolean)  // true

是否全部都是真值:

[1, false, '', NaN, 0, [], {}, '123'].every(Boolean) // false

補零:

Array(6).join('0');      // '00000'  注意:如果要補5個0,要寫6,而不是5。
Array(5).fill('0').join('')  // '00000'

數組最大值和最小值:

Math.max.apply(null, [1, 2, 3, 4, 5])  // 5
Math.min.apply(null, [1, 2, 3, 4, 5])  // 1

判斷回文字符串:

const str1 = 'string';
const str2 = str1.split('').reverse().join('');
console.log(str1 === str2); // false

數組模擬隊列:

隊列先進先出:

const arr = [1];
// 入隊
arr.push(2); 
console.log('入隊元素:', arr[arr.length -1]); // 2
// 出隊
console.log('出隊元素:', arr.shift()); // 1

獲取數組最后一個元素:

像我們平常都是這樣來獲?。?/span>

const arr = [1, 2, 3, 4, 5];
console.log(arr[arr.length - 1]);   // 5

感覺很麻煩,不過 ES 有了提案,未來可以通過 arr[-1] 這種方式來獲取,Python 也有這種風騷的操作:

目前我們可以借助 ES6 的 Proxy 對象來實現:

const arr1 = [1, 2, 3, 4, 5];
function createNegativeArrayProxy(array) {
    if (!Array.isArray(array)) {     
       throw new TypeError('Expected an array'); 
    }
    return new Proxy(array, {
      get: (target, prop, receiver) => { 
        prop = +prop;
        return Reflect.get(target, prop < 0 ? target.length + prop : prop, receiver);; 
      }    
    })
}
const arr2 = createNegativeArrayProxy(arr1);
console.log(arr1[-1]) // undefined
console.log(arr1[-2]) // undefined
console.log(arr2[-1]) // 5
console.log(arr2[-2]) // 4

注意:這樣方式雖然有趣,但是會引起性能問題,50萬次循環下,在Chrome瀏覽器,代理數組的執行時間大約為正常數組的50倍,在Firefox瀏覽器大約為20倍。在大量循環情況下,請慎用。無論是面試還是學習,你都應該掌握 Proxy 用法。

責任編輯:華軒 來源: web前端開發
相關推薦

2009-06-10 21:58:51

Javascript常

2024-12-11 08:20:57

設計模式源碼

2025-11-10 02:11:00

2025-04-25 07:10:00

GenAIAI工具人工智能

2015-06-03 15:33:10

HDFS分布式文件操作匯總

2025-06-16 08:22:23

2025-11-18 08:22:56

2021-09-16 11:02:49

Python線程

2025-10-17 08:22:32

2017-10-30 13:34:22

深度學習KerasAPI

2010-05-25 09:19:13

MySQL管理工具

2022-10-14 13:47:06

2024-02-26 00:00:00

stage函數進度

2024-01-29 18:02:46

2024-01-24 13:14:00

Python內置函數工具

2025-08-12 08:22:29

2024-10-14 08:39:29

工廠模式策略模式代碼

2009-04-30 15:26:25

Visual Stud快捷鍵技巧

2013-08-26 16:23:13

iOS應用標題移動應用標題常用單詞移動應用推廣

2010-08-27 11:17:49

DIVCSS
點贊
收藏

51CTO技術棧公眾號

婷婷成人在线| 少妇精品视频一区二区| 99精品美女| 日韩一区二区免费在线电影| 嫩草影院中文字幕| 天堂中文在线看| 日韩av手机在线免费观看| 日韩欧国产精品一区综合无码| 亚洲你懂的在线视频| 国产偷久久久精品专区| 波多野结衣在线观看一区| 99久久综合| 亚洲激情在线观看| 成人在线观看黄| 欧美被日视频| 91在线观看下载| 成人激情视频在线| 免费黄色网址在线| 亚洲国产不卡| 亚洲人成网站777色婷婷| 欧美视频亚洲图片| 久久久久久久| 一区二区三区日韩精品视频| 日本高清一区| 成人午夜视频一区二区播放| 日韩精品高清不卡| 久久久亚洲精选| 91香蕉视频网| 国产精品一区二区av日韩在线 | 中文字幕日韩欧美在线视频| 久草视频福利在线| 电影中文字幕一区二区| 欧美日韩在线观看视频| 国产一级黄色录像片| 丁香婷婷在线| 国产夜色精品一区二区av| 99精品欧美一区二区三区| а中文在线天堂| 日韩图片一区| 久久久久久久999| 欧美激情精品久久久久久免费| 你懂的一区二区三区| 亚洲精品一区二区精华| 欧美性猛交乱大交| 亚洲男人在线| 欧美日韩成人综合天天影院| 国内自拍在线观看| 2001个疯子在线观看| 亚洲激情五月婷婷| 欧美一级黄色录像片| 亚洲s色大片| 国产精品美女久久久久久久网站| 欧洲精品久久| 蜜桃视频在线入口www| av不卡一区二区三区| 国产精品久久久久久久久婷婷 | 欧美舌奴丨vk视频| 欧美日韩在线另类| 狠狠爱免费视频| 在线观看v片| 一本一道波多野结衣一区二区| 国产av麻豆mag剧集| 久久一卡二卡| 亚洲成人在线免费| 国产美女在线一区| 国产一二三在线| 精品久久久久久久久国产字幕 | 男女性色大片免费观看一区二区 | 久久久久亚洲视频| 日韩1区2区日韩1区2区| 国产精品久久久久久久久久免费 | 欧美一区二区美女| 中文字幕1区2区| gogo人体一区| 日韩国产欧美精品在线| 国产女主播喷水高潮网红在线| 亚洲精品456| 亚洲系列中文字幕| 国产精品久久久久久成人| 欧美3p视频| 久久艹在线视频| 国产真人真事毛片| 久久动漫亚洲| 国产主播精品在线| 精品国产免费无码久久久| 国产91在线|亚洲| 九9re精品视频在线观看re6| 韩国中文字幕2020精品| 国产精品久久久久久久裸模| 中文字幕の友人北条麻妃| 538在线视频| 欧美性视频一区二区三区| 91热视频在线观看| 黄色欧美网站| 在线精品国产欧美| 久久久久免费看| 国产精品腿扒开做爽爽爽挤奶网站| 国产97在线亚洲| 99久久一区二区| 91片在线免费观看| 一区二区三区四区欧美| 欧美videossex| 日韩欧美亚洲综合| 国内av一区二区| 乱亲女h秽乱长久久久| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 成人区一区二区| 欧美特大特白屁股xxxx| 日韩一二三区不卡| 成人黄色免费网址| 亚洲午夜av| 国产精品视频久久久| 蜜桃视频在线观看www| 久久精品视频免费| 日韩精品一区二区在线视频| 成人黄色免费短视频| 欧美videossexotv100| www.日本高清视频| 一区二区三区国产在线| 91久久久亚洲精品| 国产天堂在线| 亚洲成人福利片| 成人免费黄色av| 欧美丝袜激情| 亲子乱一区二区三区电影 | 国模冰冰炮一区二区| 欧美一级理论性理论a| 日本一二三不卡视频| 亚洲精品三级| 成人一区二区在线| 欧美三级理伦电影| 在线观看欧美黄色| 欧美做受喷浆在线观看| 欧美精品入口| 91啪国产在线| 秋霞午夜理伦电影在线观看| 色婷婷狠狠综合| 免费的av网站| 国产精品地址| 999视频在线观看| 日本三级视频在线观看| 欧美中文字幕一区| 精品人妻中文无码av在线| 亚洲一区黄色| 久久一区二区精品| 丝袜老师在线| 日韩毛片在线观看| 国产无遮挡又黄又爽| 粉嫩av亚洲一区二区图片| 免费在线精品视频| 亚洲人成777| 久久久精品久久久久| 中文字幕+乱码+中文乱码91| 久久精品人人做| 五月婷婷狠狠操| 不卡中文字幕| 国产日本欧美一区| 毛片在线播放a| 91麻豆精品国产无毒不卡在线观看| 青青青视频在线免费观看| 另类人妖一区二区av| 一区二区高清视频| 国产在线视频欧美一区| 久久伊人免费视频| 性一交一乱一透一a级| 亚洲一二三四久久| 日本三级日本三级日本三级极| 亚洲无毛电影| 欧美极品日韩| 韩国精品视频在线观看| xvideos亚洲人网站| 国产夫妻性生活视频| 亚洲国产综合91精品麻豆| 中文字幕一区二区人妻电影丶| 国产日韩欧美| 婷婷久久青草热一区二区| 国产福利亚洲| 欧美大片在线看免费观看| 手机在线观看免费av| 日本韩国欧美一区| 久久精品日韩无码| 国产不卡免费视频| av观看免费在线| 欧美色图在线播放| 亚洲中国色老太| 欧美a级在线观看| 国产亚洲一区二区精品| av无码精品一区二区三区宅噜噜| 亚洲一线二线三线久久久| 国产精品无码一区二区三区免费| 日本不卡视频在线| 国产肉体ⅹxxx137大胆| 天天久久夜夜| 91欧美视频网站| 大胆人体一区| 久久这里只有精品99| 人人妻人人澡人人爽久久av| 欧美亚洲一区二区在线| 欧美日韩亚洲国产另类| 久久久亚洲精品一区二区三区| 天堂中文av在线| 日韩午夜激情| 一区二区三视频| 开心激情综合| 91精品视频在线| 偷拍视频一区二区三区| 欧美大片免费观看| av网站在线免费播放| 精品国产百合女同互慰| 亚洲图片小说视频| 日韩欧美综合在线视频| 欧美黄色免费观看| 国产精品私房写真福利视频| 欧美 变态 另类 人妖| 国产精品69久久久久水密桃| 亚洲天堂av线| 国产欧美激情| 精品一区二区三区无码视频| 第一社区sis001原创亚洲| 狠狠色伊人亚洲综合网站色| 午夜不卡一区| 国产精品激情自拍| 女海盗2成人h版中文字幕| 免费91麻豆精品国产自产在线观看| 可以在线观看的av网站| 亚洲精品国产欧美| 亚洲成熟女性毛茸茸| 欧美日韩大陆一区二区| 波多野结衣黄色| 欧美日韩亚洲一区二区| 国产成人无码aa精品一区| 中文字幕高清一区| 国产肥白大熟妇bbbb视频| av色综合久久天堂av综合| 一级黄色高清视频| 精品中文字幕一区二区小辣椒| 无码无遮挡又大又爽又黄的视频| 亚洲毛片一区| 91九色丨porny丨国产jk| 国产精品vip| 激情成人开心网| 这里只有精品在线| 四虎影院一区二区| 先锋资源久久| 国产卡一卡二在线| 亚洲国产精品日韩专区av有中文| 伊人精品久久久久7777| 久久影院100000精品| 四虎永久国产精品| 欧美色网址大全| 亚洲欧洲一区二区| 99久久综合狠狠综合久久aⅴ| 亚洲.欧美.日本.国产综合在线| 国产午夜一区| 日韩欧美一区二区三区久久婷婷| 综合综合综合综合综合网| 久久伦理网站| 精品国产一区二区三区香蕉沈先生| 日本在线成人一区二区| 欧美一区二区麻豆红桃视频| 亚洲精品在线视频观看| 久久久久久免费视频| 亚洲av首页在线| 在线免费高清一区二区三区| 久久久久久免费看| 美女尤物久久精品| 天天爽人人爽夜夜爽| 精品一区二区三区在线视频| 中文字幕欧美视频| av电影天堂一区二区在线 | 秋霞影院一区二区三区| 精品欧美国产| 国产一区二区三区91| 亚洲日本欧美在线| 欧美一区二区三区另类| 久久国产精品网| 久久不射中文字幕| 伊人色在线观看| 国产69精品久久777的优势| 精品视频站长推荐| 国产视频一区二区在线| 日韩在线视频网址| 亚欧色一区w666天堂| 日韩一级片中文字幕| 宅男在线国产精品| 人妻偷人精品一区二区三区| 亚洲天堂第一页| www.在线视频| 91国自产精品中文字幕亚洲| 国产精品亚洲d| 99r国产精品视频| 日韩三级av| 亚洲一区二区三区色| 午夜久久福利| 激情网站五月天| 国产高清一区日本| 免费视频91蜜桃| 一区二区在线观看视频| 日韩一级在线视频| 日韩午夜激情免费电影| 国产精品麻豆一区二区三区| 欧美高清在线播放| 嫩草伊人久久精品少妇av杨幂| 亚洲一区二区三区毛片| 在线看成人短视频| 久久男人资源站| 男男视频亚洲欧美| 国产成人无码一区二区在线观看| 日韩毛片精品高清免费| www.伊人久久| 日韩欧美国产综合| av在线播放免费| 97免费视频在线| 日韩成人视屏| 亚洲一卡二卡三卡| 亚洲自啪免费| 欧美xxxx×黑人性爽| 亚洲同性同志一二三专区| 波多野结衣毛片| 亚洲精品国产精品乱码不99按摩 | 色网站在线视频| 久久久激情视频| 日韩美女视频网站| 欧美一区二区三区视频免费| aaa在线观看| 国产不卡一区二区在线播放| 超碰97久久国产精品牛牛| 超碰在线免费观看97| 日本女人一区二区三区| aaaaa一级片| 精品久久久久久亚洲国产300| 99热这里只有精品9| 久久精品2019中文字幕| 素人啪啪色综合| 青青草久久网络| 亚洲一区二区三区免费在线观看 | 卡通动漫国产精品| 无码人妻精品一区二区蜜桃网站| 精品伊人久久久久7777人| 最新中文字幕av| 91黄色免费看| 极品白浆推特女神在线观看 | 青春草在线视频免费观看| 日本在线不卡视频| 69精品无码成人久久久久久| 欧美日韩在线视频观看| 亚洲女人18毛片水真多| 免费不卡在线观看av| av成人在线网站| 熟女视频一区二区三区| 激情综合色播五月| 国产精品99久久久久久成人| 欧美群妇大交群中文字幕| 色多多视频在线观看| 国产日韩在线亚洲字幕中文| 久久国产亚洲| 天天干天天色天天干| 中文字幕亚洲一区二区av在线| 91精品国产色综合久久不8| 色老头一区二区三区| 国产aa精品| 国产尤物av一区二区三区| 粉嫩一区二区三区性色av| 日本一级淫片免费放| 亚洲免费人成在线视频观看| 日韩在线免费| 中文字幕一区二区三区乱码| 国产一区不卡视频| 久久久久久久久久久久久久久久久 | 一区二区三区亚洲视频| 久久久精品免费| 国产香蕉精品| 无码人妻丰满熟妇区毛片| 国产精品欧美久久久久一区二区| 国产美女精品视频国产| 欧美国产第一页| 久久久免费毛片| 久草在在线视频| 亚洲日穴在线视频| 欧美天堂在线视频| 国产成人精品免费视频| 久久国产电影| 丰满少妇xbxb毛片日本| 欧美午夜精品久久久久久浪潮| 97电影在线看视频| 亚洲自拍偷拍色图| 亚洲一区二区三区四区五区午夜| 91麻豆制片厂| 欧美va亚洲va| 在线观看精品| 日韩视频 中文字幕| 久久综合九色欧美综合狠狠| 97免费观看视频| 久久人人爽国产| 日韩在线观看一区| 老司机免费视频| 欧美女孩性生活视频| 免费v片在线观看| 欧美一级黄色录像片| 久久毛片高清国产|