日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ES6之路第九篇:Set和Map数据结构

發(fā)布時間:2024/8/26 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ES6之路第九篇:Set和Map数据结构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

set

基本用法

ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復的值。

Set 本身是一個構(gòu)造函數(shù),用來生成 Set 數(shù)據(jù)結(jié)構(gòu)。

1 const s = new Set(); 2 3 [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x)); 4 5 for (let i of s) { 6 console.log(i); 7 } 8 // 2 3 5 4

上面代碼通過add方法向 Set 結(jié)構(gòu)加入成員,結(jié)果表明 Set 結(jié)構(gòu)不會添加重復的值。

Set 函數(shù)可以接受一個數(shù)組(或者具有 iterable 接口的其他數(shù)據(jù)結(jié)構(gòu))作為參數(shù),用來初始化。

1 // 例一 2 const set = new Set([1, 2, 3, 4, 4]); 3 [...set] 4 // [1, 2, 3, 4] 5 6 // 例二 7 const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); 8 items.size // 5 9 10 // 例三 11 const set = new Set(document.querySelectorAll('div')); 12 set.size // 56 13 14 // 類似于 15 const set = new Set(); 16 document 17 .querySelectorAll('div') 18 .forEach(div => set.add(div)); 19 set.size // 56

上面代碼中,例一和例二都是Set函數(shù)接受數(shù)組作為參數(shù),例三是接受類似數(shù)組的對象作為參數(shù)。

上面代碼也展示了一種去除數(shù)組重復成員的方法。

1 // 去除數(shù)組的重復成員 2 [...new Set(array)]

向 Set 加入值的時候,不會發(fā)生類型轉(zhuǎn)換,所以5和"5"是兩個不同的值。Set 內(nèi)部判斷兩個值是否不同,使用的算法叫做“Same-value-zero equality”,它類似于精確相等運算符(===),主要的區(qū)別是NaN等于自身,而精確相等運算符認為NaN不等于自身。

1 let set = new Set(); 2 let a = NaN; 3 let b = NaN; 4 set.add(a); 5 set.add(b); 6 set // Set {NaN}

上面代碼向 Set 實例添加了兩個NaN,但是只能加入一個。這表明,在 Set 內(nèi)部,兩個NaN是相等。

另外,兩個對象總是不相等的。

1 let set = new Set(); 2 3 set.add({}); 4 set.size // 1 5 6 set.add({}); 7 set.size // 2

上面代碼表示,由于兩個空對象不相等,所以它們被視為兩個值。

Set實例的屬性和方法

Set 結(jié)構(gòu)的實例有以下屬性。

  • Set.prototype.constructor:構(gòu)造函數(shù),默認就是Set函數(shù)。
  • Set.prototype.size:返回Set實例的成員總數(shù)。

Set 實例的方法分為兩大類:操作方法(用于操作數(shù)據(jù))和遍歷方法(用于遍歷成員)。下面先介紹四個操作方法。

  • add(value):添加某個值,返回 Set 結(jié)構(gòu)本身。
  • delete(value):刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value):返回一個布爾值,表示該值是否為Set的成員。
  • clear():清除所有成員,沒有返回值。

上面這些屬性和方法的實例如下。

1 s.add(1).add(2).add(2); 2 // 注意2被加入了兩次 3 4 s.size // 2 5 6 s.has(1) // true 7 s.has(2) // true 8 s.has(3) // false 9 10 s.delete(2); 11 s.has(2) // false

下面是一個對比,看看在判斷是否包括一個鍵上面,Object結(jié)構(gòu)和Set結(jié)構(gòu)的寫法不同。

1 // 對象的寫法 2 const properties = { 3 'width': 1, 4 'height': 1 5 }; 6 7 if (properties[someName]) { 8 // do something 9 } 10 11 // Set的寫法 12 const properties = new Set(); 13 14 properties.add('width'); 15 properties.add('height'); 16 17 if (properties.has(someName)) { 18 // do something 19 }

Array.from方法可以將 Set 結(jié)構(gòu)轉(zhuǎn)為數(shù)組。

1 const items = new Set([1, 2, 3, 4, 5]); 2 const array = Array.from(items);

這就提供了去除數(shù)組重復成員的另一種方法。

1 function dedupe(array) { 2 return Array.from(new Set(array)); 3 } 4 5 dedupe([1, 1, 2, 3]) // [1, 2, 3]

遍歷操作

Set 結(jié)構(gòu)的實例有四個遍歷方法,可以用于遍歷成員。

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對的遍歷器
  • forEach():使用回調(diào)函數(shù)遍歷每個成員

需要特別指出的是,Set的遍歷順序就是插入順序。這個特性有時非常有用,比如使用 Set 保存一個回調(diào)函數(shù)列表,調(diào)用時就能保證按照添加順序調(diào)用。

(1)keys(),values(),entries()

keys方法、values方法、entries方法返回的都是遍歷器對象(詳見《Iterator 對象》一章)。由于 Set 結(jié)構(gòu)沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致。

1 let set = new Set(['red', 'green', 'blue']); 2 3 for (let item of set.keys()) { 4 console.log(item); 5 } 6 // red 7 // green 8 // blue 9 10 for (let item of set.values()) { 11 console.log(item); 12 } 13 // red 14 // green 15 // blue 16 17 for (let item of set.entries()) { 18 console.log(item); 19 } 20 // ["red", "red"] 21 // ["green", "green"] 22 // ["blue", "blue"]

上面代碼中,entries方法返回的遍歷器,同時包括鍵名和鍵值,所以每次輸出一個數(shù)組,它的兩個成員完全相等。

Set 結(jié)構(gòu)的實例默認可遍歷,它的默認遍歷器生成函數(shù)就是它的values方法。

1 Set.prototype[Symbol.iterator] === Set.prototype.values 2 // true

這意味著,可以省略values方法,直接用for...of循環(huán)遍歷 Set。

1 let set = new Set(['red', 'green', 'blue']); 2 3 for (let x of set) { 4 console.log(x); 5 } 6 // red 7 // green 8 // blue

(2)forEach()

Set 結(jié)構(gòu)的實例與數(shù)組一樣,也擁有forEach方法,用于對每個成員執(zhí)行某種操作,沒有返回值。

1 set = new Set([1, 4, 9]); 2 set.forEach((value, key) => console.log(key + ' : ' + value)) 3 // 1 : 1 4 // 4 : 4 5 // 9 : 9

上面代碼說明,forEach方法的參數(shù)就是一個處理函數(shù)。該函數(shù)的參數(shù)與數(shù)組的forEach一致,依次為鍵值、鍵名、集合本身(上例省略了該參數(shù))。這里需要注意,Set 結(jié)構(gòu)的鍵名就是鍵值(兩者是同一個值),因此第一個參數(shù)與第二個參數(shù)的值永遠都是一樣的。

另外,forEach方法還可以有第二個參數(shù),表示綁定處理函數(shù)內(nèi)部的this對象。

(3)遍歷的應用

擴展運算符(...)內(nèi)部使用for...of循環(huán),所以也可以用于 Set 結(jié)構(gòu)。

1 let set = new Set(['red', 'green', 'blue']); 2 let arr = [...set]; 3 // ['red', 'green', 'blue']

擴展運算符和 Set 結(jié)構(gòu)相結(jié)合,就可以去除數(shù)組的重復成員。

1 let arr = [3, 5, 2, 2, 5, 5]; 2 let unique = [...new Set(arr)]; 3 // [3, 5, 2]

而且,數(shù)組的map和filter方法也可以間接用于 Set 了。

1 let set = new Set([1, 2, 3]); 2 set = new Set([...set].map(x => x * 2)); 3 // 返回Set結(jié)構(gòu):{2, 4, 6} 4 5 let set = new Set([1, 2, 3, 4, 5]); 6 set = new Set([...set].filter(x => (x % 2) == 0)); 7 // 返回Set結(jié)構(gòu):{2, 4}

因此使用 Set 可以很容易地實現(xiàn)并集(Union)、交集(Intersect)和差集(Difference)。

1 let a = new Set([1, 2, 3]); 2 let b = new Set([4, 3, 2]); 3 4 // 并集 5 let union = new Set([...a, ...b]); 6 // Set {1, 2, 3, 4} 7 8 // 交集 9 let intersect = new Set([...a].filter(x => b.has(x))); 10 // set {2, 3} 11 12 // 差集 13 let difference = new Set([...a].filter(x => !b.has(x))); 14 // Set {1}

如果想在遍歷操作中,同步改變原來的 Set 結(jié)構(gòu),目前沒有直接的方法,但有兩種變通方法。一種是利用原 Set 結(jié)構(gòu)映射出一個新的結(jié)構(gòu),然后賦值給原來的 Set 結(jié)構(gòu);另一種是利用Array.from方法。

1 // 方法一 2 let set = new Set([1, 2, 3]); 3 set = new Set([...set].map(val => val * 2)); 4 // set的值是2, 4, 6 5 6 // 方法二 7 let set = new Set([1, 2, 3]); 8 set = new Set(Array.from(set, val => val * 2)); 9 // set的值是2, 4, 6

上面代碼提供了兩種方法,直接在遍歷操作中改變原來的 Set 結(jié)構(gòu)。

WeakSet

含義

WeakSet 結(jié)構(gòu)與 Set 類似,也是不重復的值的集合。但是,它與 Set 有兩個區(qū)別。

首先,WeakSet 的成員只能是對象,而不能是其他類型的值。

1 const ws = new WeakSet(); 2 ws.add(1) 3 // TypeError: Invalid value used in weak set 4 ws.add(Symbol()) 5 // TypeError: invalid value used in weak set

上面代碼試圖向 WeakSet 添加一個數(shù)值和Symbol值,結(jié)果報錯,因為 WeakSet 只能放置對象。

其次,WeakSet 中的對象都是弱引用,即垃圾回收機制不考慮 WeakSet 對該對象的引用,也就是說,如果其他對象都不再引用該對象,那么垃圾回收機制會自動回收該對象所占用的內(nèi)存,不考慮該對象還存在于 WeakSet 之中。

這是因為垃圾回收機制依賴引用計數(shù),如果一個值的引用次數(shù)不為0,垃圾回收機制就不會釋放這塊內(nèi)存。結(jié)束使用該值之后,有時會忘記取消引用,導致內(nèi)存無法釋放,進而可能會引發(fā)內(nèi)存泄漏。WeakSet 里面的引用,都不計入垃圾回收機制,所以就不存在這個問題。因此,WeakSet 適合臨時存放一組對象,以及存放跟對象綁定的信息。只要這些對象在外部消失,它在 WeakSet 里面的引用就會自動消失。

由于上面這個特點,WeakSet 的成員是不適合引用的,因為它會隨時消失。另外,由于 WeakSet 內(nèi)部有多少個成員,取決于垃圾回收機制有沒有運行,運行前后很可能成員個數(shù)是不一樣的,而垃圾回收機制何時運行是不可預測的,因此 ES6 規(guī)定 WeakSet 不可遍歷。

這些特點同樣適用于本章后面要介紹的 WeakMap 結(jié)構(gòu)。

語法

WeakSet 是一個構(gòu)造函數(shù),可以使用new命令,創(chuàng)建 WeakSet 數(shù)據(jù)結(jié)構(gòu)。

1 1 const ws = new WeakSet();

作為構(gòu)造函數(shù),WeakSet 可以接受一個數(shù)組或類似數(shù)組的對象作為參數(shù)。(實際上,任何具有 Iterable 接口的對象,都可以作為 WeakSet 的參數(shù)。)該數(shù)組的所有成員,都會自動成為 WeakSet 實例對象的成員。

1 const a = [[1, 2], [3, 4]]; 2 const ws = new WeakSet(a); 3 // WeakSet {[1, 2], [3, 4]}

上面代碼中,a是一個數(shù)組,它有兩個成員,也都是數(shù)組。將a作為 WeakSet 構(gòu)造函數(shù)的參數(shù),a的成員會自動成為 WeakSet 的成員。

注意,是a數(shù)組的成員成為 WeakSet 的成員,而不是a數(shù)組本身。這意味著,數(shù)組的成員只能是對象。

1 const b = [3, 4]; 2 const ws = new WeakSet(b); 3 // Uncaught TypeError: Invalid value used in weak set(…)

上面代碼中,數(shù)組b的成員不是對象,加入 WeaKSet 就會報錯。

WeakSet 結(jié)構(gòu)有以下三個方法。

  • WeakSet.prototype.add(value):向 WeakSet 實例添加一個新成員。
  • WeakSet.prototype.delete(value):清除 WeakSet 實例的指定成員。
  • WeakSet.prototype.has(value):返回一個布爾值,表示某個值是否在 WeakSet 實例之中。

下面是一個例子。

1 const ws = new WeakSet(); 2 const obj = {}; 3 const foo = {}; 4 5 ws.add(window); 6 ws.add(obj); 7 8 ws.has(window); // true 9 ws.has(foo); // false 10 11 ws.delete(window); 12 ws.has(window); // false

WeakSet 沒有size屬性,沒有辦法遍歷它的成員。

1 ws.size // undefined 2 ws.forEach // undefined 3 4 ws.forEach(function(item){ console.log('WeakSet has ' + item)}) 5 // TypeError: undefined is not a function

上面代碼試圖獲取size和forEach屬性,結(jié)果都不能成功。

WeakSet 不能遍歷,是因為成員都是弱引用,隨時可能消失,遍歷機制無法保證成員的存在,很可能剛剛遍歷結(jié)束,成員就取不到了。WeakSet 的一個用處,是儲存 DOM 節(jié)點,而不用擔心這些節(jié)點從文檔移除時,會引發(fā)內(nèi)存泄漏。

下面是 WeakSet 的另一個例子。

1 const foos = new WeakSet() 2 class Foo { 3 constructor() { 4 foos.add(this) 5 } 6 method () { 7 if (!foos.has(this)) { 8 throw new TypeError('Foo.prototype.method 只能在Foo的實例上調(diào)用!'); 9 } 10 } 11 }

上面代碼保證了Foo的實例方法,只能在Foo的實例上調(diào)用。這里使用 WeakSet 的好處是,foos對實例的引用,不會被計入內(nèi)存回收機制,所以刪除實例的時候,不用考慮foos,也不會出現(xiàn)內(nèi)存泄漏。

Map

含義和基本用法

JavaScript 的對象(Object),本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當作鍵。這給它的使用帶來了很大的限制。

1 const data = {}; 2 const element = document.getElementById('myDiv'); 3 4 data[element] = 'metadata'; 5 data['[object HTMLDivElement]'] // "metadata"

上面代碼原意是將一個 DOM 節(jié)點作為對象data的鍵,但是由于對象只接受字符串作為鍵名,所以element被自動轉(zhuǎn)為字符串[object HTMLDivElement]。

為了解決這個問題,ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。也就是說,Object 結(jié)構(gòu)提供了“字符串—值”的對應,Map 結(jié)構(gòu)提供了“值—值”的對應,是一種更完善的 Hash 結(jié)構(gòu)實現(xiàn)。如果你需要“鍵值對”的數(shù)據(jù)結(jié)構(gòu),Map 比 Object 更合適。

1 const m = new Map(); 2 const o = {p: 'Hello World'}; 3 4 m.set(o, 'content') 5 m.get(o) // "content" 6 7 m.has(o) // true 8 m.delete(o) // true 9 m.has(o) // false

上面代碼使用 Map 結(jié)構(gòu)的set方法,將對象o當作m的一個鍵,然后又使用get方法讀取這個鍵,接著使用delete方法刪除了這個鍵。

上面的例子展示了如何向 Map 添加成員。作為構(gòu)造函數(shù),Map 也可以接受一個數(shù)組作為參數(shù)。該數(shù)組的成員是一個個表示鍵值對的數(shù)組。

1 const map = new Map([ 2 ['name', '張三'], 3 ['title', 'Author'] 4 ]); 5 6 map.size // 2 7 map.has('name') // true 8 map.get('name') // "張三" 9 map.has('title') // true 10 map.get('title') // "Author"

上面代碼在新建 Map 實例時,就指定了兩個鍵name和title。

Map構(gòu)造函數(shù)接受數(shù)組作為參數(shù),實際上執(zhí)行的是下面的算法。

1 const items = [ 2 ['name', '張三'], 3 ['title', 'Author'] 4 ]; 5 6 const map = new Map(); 7 8 items.forEach( 9 ([key, value]) => map.set(key, value) 10 );

?事實上,不僅僅是數(shù)組,任何具有 Iterator 接口、且每個成員都是一個雙元素的數(shù)組的數(shù)據(jù)結(jié)構(gòu)(詳見《Iterator》一章)都可以當作Map構(gòu)造函數(shù)的參數(shù)。這就是說,Set和Map都可以用來生成新的 Map。

1 const set = new Set([ 2 ['foo', 1], 3 ['bar', 2] 4 ]); 5 const m1 = new Map(set); 6 m1.get('foo') // 1 7 8 const m2 = new Map([['baz', 3]]); 9 const m3 = new Map(m2); 10 m3.get('baz') // 3

上面代碼中,我們分別使用 Set 對象和 Map 對象,當作Map構(gòu)造函數(shù)的參數(shù),結(jié)果都生成了新的 Map 對象。

如果對同一個鍵多次賦值,后面的值將覆蓋前面的值。

1 const map = new Map(); 2 3 map 4 .set(1, 'aaa') 5 .set(1, 'bbb'); 6 7 map.get(1) // "bbb"

上面代碼對鍵1連續(xù)賦值兩次,后一次的值覆蓋前一次的值。

如果讀取一個未知的鍵,則返回undefined。

1 new Map().get('asfddfsasadf') 2 // undefined

注意,只有對同一個對象的引用,Map 結(jié)構(gòu)才將其視為同一個鍵。這一點要非常小心。

1 const map = new Map(); 2 3 map.set(['a'], 555); 4 map.get(['a']) // undefined

上面代碼的set和get方法,表面是針對同一個鍵,但實際上這是兩個值,內(nèi)存地址是不一樣的,因此get方法無法讀取該鍵,返回undefined。

同理,同樣的值的兩個實例,在 Map 結(jié)構(gòu)中被視為兩個鍵。

1 const map = new Map(); 2 3 const k1 = ['a']; 4 const k2 = ['a']; 5 6 map 7 .set(k1, 111) 8 .set(k2, 222); 9 10 map.get(k1) // 111 11 map.get(k2) // 222

上面代碼中,變量k1和k2的值是一樣的,但是它們在 Map 結(jié)構(gòu)中被視為兩個鍵。

由上可知,Map 的鍵實際上是跟內(nèi)存地址綁定的,只要內(nèi)存地址不一樣,就視為兩個鍵。這就解決了同名屬性碰撞(clash)的問題,我們擴展別人的庫的時候,如果使用對象作為鍵名,就不用擔心自己的屬性與原作者的屬性同名。

如果 Map 的鍵是一個簡單類型的值(數(shù)字、字符串、布爾值),則只要兩個值嚴格相等,Map 將其視為一個鍵,比如0和-0就是一個鍵,布爾值true和字符串true則是兩個不同的鍵。另外,undefined和null也是兩個不同的鍵。雖然NaN不嚴格相等于自身,但 Map 將其視為同一個鍵。

1 let map = new Map(); 2 3 map.set(-0, 123); 4 map.get(+0) // 123 5 6 map.set(true, 1); 7 map.set('true', 2); 8 map.get(true) // 1 9 10 map.set(undefined, 3); 11 map.set(null, 4); 12 map.get(undefined) // 3 13 14 map.set(NaN, 123); 15 map.get(NaN) // 123

實例的屬性和操作方法

(1)size 屬性

size屬性返回 Map 結(jié)構(gòu)的成員總數(shù)。

1 const map = new Map(); 2 map.set('foo', true); 3 map.set('bar', false); 4 5 map.size // 2

(2)set(key, value)

set方法設置鍵名key對應的鍵值為value,然后返回整個 Map 結(jié)構(gòu)。如果key已經(jīng)有值,則鍵值會被更新,否則就新生成該鍵。

1 const m = new Map(); 2 3 m.set('edition', 6) // 鍵是字符串 4 m.set(262, 'standard') // 鍵是數(shù)值 5 m.set(undefined, 'nah') // 鍵是 undefined

set方法返回的是當前的Map對象,因此可以采用鏈式寫法。

1 let map = new Map() 2 .set(1, 'a') 3 .set(2, 'b') 4 .set(3, 'c');

(3)get(key)

get方法讀取key對應的鍵值,如果找不到key,返回undefined。

1 const m = new Map(); 2 3 const hello = function() {console.log('hello');}; 4 m.set(hello, 'Hello ES6!') // 鍵是函數(shù) 5 6 m.get(hello) // Hello ES6!

(4)has(key)

has方法返回一個布爾值,表示某個鍵是否在當前 Map 對象之中。

1 const m = new Map(); 2 3 m.set('edition', 6); 4 m.set(262, 'standard'); 5 m.set(undefined, 'nah'); 6 7 m.has('edition') // true 8 m.has('years') // false 9 m.has(262) // true 10 m.has(undefined) // true

(5)delete(key)

delete方法刪除某個鍵,返回true。如果刪除失敗,返回false。

1 const m = new Map(); 2 m.set(undefined, 'nah'); 3 m.has(undefined) // true 4 5 m.delete(undefined) 6 m.has(undefined) // false

(6)clear()

clear方法清除所有成員,沒有返回值。

1 let map = new Map(); 2 map.set('foo', true); 3 map.set('bar', false); 4 5 map.size // 2 6 map.clear() 7 map.size // 0

遍歷方法

Map 結(jié)構(gòu)原生提供三個遍歷器生成函數(shù)和一個遍歷方法。

  • keys():返回鍵名的遍歷器。
  • values():返回鍵值的遍歷器。
  • entries():返回所有成員的遍歷器。
  • forEach():遍歷 Map 的所有成員。

需要特別注意的是,Map 的遍歷順序就是插入順序。

1 const map = new Map([ 2 ['F', 'no'], 3 ['T', 'yes'], 4 ]); 5 6 for (let key of map.keys()) { 7 console.log(key); 8 } 9 // "F" 10 // "T" 11 12 for (let value of map.values()) { 13 console.log(value); 14 } 15 // "no" 16 // "yes" 17 18 for (let item of map.entries()) { 19 console.log(item[0], item[1]); 20 } 21 // "F" "no" 22 // "T" "yes" 23 24 // 或者 25 for (let [key, value] of map.entries()) { 26 console.log(key, value); 27 } 28 // "F" "no" 29 // "T" "yes" 30 31 // 等同于使用map.entries() 32 for (let [key, value] of map) { 33 console.log(key, value); 34 } 35 // "F" "no" 36 // "T" "yes"

上面代碼最后的那個例子,表示 Map 結(jié)構(gòu)的默認遍歷器接口(Symbol.iterator屬性),就是entries方法。

1 map[Symbol.iterator] === map.entries 2 // true

Map 結(jié)構(gòu)轉(zhuǎn)為數(shù)組結(jié)構(gòu),比較快速的方法是使用擴展運算符(...)。

1 const map = new Map([ 2 [1, 'one'], 3 [2, 'two'], 4 [3, 'three'], 5 ]); 6 7 [...map.keys()] 8 // [1, 2, 3] 9 10 [...map.values()] 11 // ['one', 'two', 'three'] 12 13 [...map.entries()] 14 // [[1,'one'], [2, 'two'], [3, 'three']] 15 16 [...map] 17 // [[1,'one'], [2, 'two'], [3, 'three']]

結(jié)合數(shù)組的map方法、filter方法,可以實現(xiàn) Map 的遍歷和過濾(Map 本身沒有map和filter方法)。

1 const map0 = new Map() 2 .set(1, 'a') 3 .set(2, 'b') 4 .set(3, 'c'); 5 6 const map1 = new Map( 7 [...map0].filter(([k, v]) => k < 3) 8 ); 9 // 產(chǎn)生 Map 結(jié)構(gòu) {1 => 'a', 2 => 'b'} 10 11 const map2 = new Map( 12 [...map0].map(([k, v]) => [k * 2, '_' + v]) 13 ); 14 // 產(chǎn)生 Map 結(jié)構(gòu) {2 => '_a', 4 => '_b', 6 => '_c'}

此外,Map 還有一個forEach方法,與數(shù)組的forEach方法類似,也可以實現(xiàn)遍歷。

1 map.forEach(function(value, key, map) { 2 console.log("Key: %s, Value: %s", key, value); 3 });

forEach方法還可以接受第二個參數(shù),用來綁定this。

1 const reporter = { 2 report: function(key, value) { 3 console.log("Key: %s, Value: %s", key, value); 4 } 5 }; 6 7 map.forEach(function(value, key, map) { 8 this.report(key, value); 9 }, reporter);

上面代碼中,forEach方法的回調(diào)函數(shù)的this,就指向reporter。

與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換

(1)Map 轉(zhuǎn)為數(shù)組

前面已經(jīng)提過,Map 轉(zhuǎn)為數(shù)組最方便的方法,就是使用擴展運算符(...)。

1 const myMap = new Map() 2 .set(true, 7) 3 .set({foo: 3}, ['abc']); 4 [...myMap] 5 // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]

(2)數(shù)組 轉(zhuǎn)為 Map

將數(shù)組傳入 Map 構(gòu)造函數(shù),就可以轉(zhuǎn)為 Map。

1 new Map([ 2 [true, 7], 3 [{foo: 3}, ['abc']] 4 ]) 5 // Map { 6 // true => 7, 7 // Object {foo: 3} => ['abc'] 8 // }

(3)Map 轉(zhuǎn)為對象

如果所有 Map 的鍵都是字符串,它可以無損地轉(zhuǎn)為對象。

1 function strMapToObj(strMap) { 2 let obj = Object.create(null); 3 for (let [k,v] of strMap) { 4 obj[k] = v; 5 } 6 return obj; 7 } 8 9 const myMap = new Map() 10 .set('yes', true) 11 .set('no', false); 12 strMapToObj(myMap) 13 // { yes: true, no: false }

如果有非字符串的鍵名,那么這個鍵名會被轉(zhuǎn)成字符串,再作為對象的鍵名。

(4)對象轉(zhuǎn)為 Map

1 function objToStrMap(obj) { 2 let strMap = new Map(); 3 for (let k of Object.keys(obj)) { 4 strMap.set(k, obj[k]); 5 } 6 return strMap; 7 } 8 9 objToStrMap({yes: true, no: false}) 10 // Map {"yes" => true, "no" => false}

(5)Map 轉(zhuǎn)為 JSON

Map 轉(zhuǎn)為 JSON 要區(qū)分兩種情況。一種情況是,Map 的鍵名都是字符串,這時可以選擇轉(zhuǎn)為對象 JSON。

1 function strMapToJson(strMap) { 2 return JSON.stringify(strMapToObj(strMap)); 3 } 4 5 let myMap = new Map().set('yes', true).set('no', false); 6 strMapToJson(myMap) 7 // '{"yes":true,"no":false}'

另一種情況是,Map 的鍵名有非字符串,這時可以選擇轉(zhuǎn)為數(shù)組 JSON。

1 function mapToArrayJson(map) { 2 return JSON.stringify([...map]); 3 } 4 5 let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']); 6 mapToArrayJson(myMap) 7 // '[[true,7],[{"foo":3},["abc"]]]'

(6)JSON 轉(zhuǎn)為 Map

JSON 轉(zhuǎn)為 Map,正常情況下,所有鍵名都是字符串。

1 function jsonToStrMap(jsonStr) { 2 return objToStrMap(JSON.parse(jsonStr)); 3 } 4 5 jsonToStrMap('{"yes": true, "no": false}') 6 // Map {'yes' => true, 'no' => false}

但是,有一種特殊情況,整個 JSON 就是一個數(shù)組,且每個數(shù)組成員本身,又是一個有兩個成員的數(shù)組。這時,它可以一一對應地轉(zhuǎn)為 Map。這往往是 Map 轉(zhuǎn)為數(shù)組 JSON 的逆操作。

1 function jsonToMap(jsonStr) { 2 return new Map(JSON.parse(jsonStr)); 3 } 4 5 jsonToMap('[[true,7],[{"foo":3},["abc"]]]') 6 // Map {true => 7, Object {foo: 3} => ['abc']}

WeakMap

含義

WeakMap結(jié)構(gòu)與Map結(jié)構(gòu)類似,也是用于生成鍵值對的集合。

1 // WeakMap 可以使用 set 方法添加成員 2 const wm1 = new WeakMap(); 3 const key = {foo: 1}; 4 wm1.set(key, 2); 5 wm1.get(key) // 2 6 7 // WeakMap 也可以接受一個數(shù)組, 8 // 作為構(gòu)造函數(shù)的參數(shù) 9 const k1 = [1, 2, 3]; 10 const k2 = [4, 5, 6]; 11 const wm2 = new WeakMap([[k1, 'foo'], [k2, 'bar']]); 12 wm2.get(k2) // "bar"

WeakMap與Map的區(qū)別有兩點。

首先,WeakMap只接受對象作為鍵名(null除外),不接受其他類型的值作為鍵名。

1 const map = new WeakMap(); 2 map.set(1, 2) 3 // TypeError: 1 is not an object! 4 map.set(Symbol(), 2) 5 // TypeError: Invalid value used as weak map key 6 map.set(null, 2) 7 // TypeError: Invalid value used as weak map key

上面代碼中,如果將數(shù)值1和Symbol值作為 WeakMap 的鍵名,都會報錯。

其次,WeakMap的鍵名所指向的對象,不計入垃圾回收機制。

WeakMap的設計目的在于,有時我們想在某個對象上面存放一些數(shù)據(jù),但是這會形成對于這個對象的引用。請看下面的例子。

1 const e1 = document.getElementById('foo'); 2 const e2 = document.getElementById('bar'); 3 const arr = [ 4 [e1, 'foo 元素'], 5 [e2, 'bar 元素'], 6 ];

?

轉(zhuǎn)載于:https://www.cnblogs.com/wanghao123/p/9330556.html

總結(jié)

以上是生活随笔為你收集整理的ES6之路第九篇:Set和Map数据结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

99精品在线免费观看 | 国产三级久久久 | 国产精品美女久久久久aⅴ 干干夜夜 | 西西444www大胆高清图片 | 一区二区三区韩国免费中文网站 | 欧美老少交 | 精品91| 人人澡人人干 | 不卡电影免费在线播放一区 | 国产精品嫩草影视久久久 | 国产一区二区手机在线观看 | 国产一区av在线 | 成人免费毛片aaaaaa片 | 国产一卡二卡在线 | 日韩有码专区 | 国产探花视频在线播放 | 亚洲做受高潮欧美裸体 | 精品国产99国产精品 | 日韩美女av在线 | 亚洲一级黄色 | 欧美少妇影院 | 亚洲天堂网站 | 在线观看岛国av | 97超碰网 | 欧美大片aaa | 91精品一区二区三区蜜桃 | 国产精品一区二区三区四 | www.日韩免费 | 亚洲专区欧美专区 | 国内精品中文字幕 | 成人亚洲网 | 久草久草在线 | 午夜精品一区二区三区在线观看 | 亚洲免费一级 | 中文在线免费一区三区 | 欧美激情第一页xxx 午夜性福利 | 久久99久久99精品 | www.久久久精品 | 特级毛片网 | 国产视频精选在线 | 日韩精品免费一线在线观看 | 午夜视频在线观看一区二区 | 在线免费视频a | 欧美国产日韩在线视频 | 天天色中文 | av电影一区| 国产 日韩 中文字幕 | 成人毛片一区 | 69精品在线 | 日韩亚洲在线观看 | 色视频在线免费观看 | av在线com| 在线视频黄| 欧美在线你懂的 | www.狠狠操.com | 国产精品久久久久影院日本 | 久久狠狠一本精品综合网 | 激情欧美丁香 | 91av99| 色网站免费在线观看 | 日本中文乱码卡一卡二新区 | 中文字幕999 | 伊人国产女| 激情狠狠干 | 91porny九色91啦中文 | 亚洲午夜激情网 | 国产精品久久久久婷婷二区次 | 亚洲精品1区2区3区 超碰成人网 | www.五月天色 | 中文字幕欧美三区 | 亚洲精品国产片 | 日韩欧美一区二区三区视频 | 中文国产成人精品久久一 | 国产视频精选 | 福利片视频区 | 五月天综合婷婷 | 日韩av在线资源 | 久99视频| 中文字幕91在线 | 狠狠操夜夜 | 午夜视频一区二区三区 | 亚洲91视频 | 顶级欧美色妇4khd | 欧美成a人片在线观看久 | av片无限看| 天天操天天干天天摸 | 黄色av电影网 | 亚洲一区在线看 | 色视频在线免费观看 | 国产精品久久久久久久av大片 | 日韩在线免费不卡 | 久久精品人 | 99久久99视频只有精品 | 亚洲黄色免费在线 | 四虎影视av| 黄色资源在线观看 | 91亚洲精品久久久蜜桃网站 | 欧美日韩一区二区三区在线观看视频 | 成人免费在线观看av | 粉嫩av一区二区三区四区五区 | 91亚洲国产成人久久精品网站 | 日韩一级电影在线 | 98涩涩国产露脸精品国产网 | 夜夜骑天天操 | 成人app在线免费观看 | 91伊人| 麻豆视频免费播放 | 婷婷av网站 | 亚洲黄色成人 | 国产原创在线 | 一区二区三区四区五区在线 | 国产亚洲在线视频 | 婷婷福利影院 | 人人干人人添 | 亚洲国产中文字幕在线视频综合 | 亚洲h在线播放在线观看h | 国产精品久久久久久久久久久久冷 | 三级黄色片在线观看 | 久草电影在线 | 亚洲精品高清一区二区三区四区 | 免费福利小视频 | 激情五月婷婷 | 日韩三级视频 | 久久艹国产视频 | 又粗又长又大又爽又黄少妇毛片 | 91精品一区二区三区蜜臀 | 高清av网站 | 日本精品视频免费 | 在线观看成人av | free,性欧美 九九交易行官网 | www.亚洲精品在线 | 午夜精品99久久免费 | 久久国产欧美日韩 | 777xxx欧美| 日韩午夜大片 | 久久久久国产精品www | 国产精品久久久电影 | 国产香蕉97碰碰久久人人 | 日日夜夜天天干 | 久久久久黄 | 91久草视频 | 欧美成人猛片 | 成人在线播放免费观看 | .精品久久久麻豆国产精品 亚洲va欧美 | 国产精品久久久久久久久免费 | 免费av观看 | 亚洲精品综合欧美二区变态 | 偷拍精偷拍精品欧洲亚洲网站 | 337p西西人体大胆瓣开下部 | 人人玩人人添人人澡97 | 亚洲免费公开视频 | 亚洲精品乱码久久久久久 | 久久草网 | 成人午夜黄色影院 | 国产五月婷婷 | 激情av资源 | 91精品免费在线观看 | 91精品久久久久久久久久入口 | 久久精品资源 | 亚洲五月六月 | 国产精品va最新国产精品视频 | 亚洲精品综合在线观看 | 91尤物国产尤物福利在线播放 | 97在线超碰 | 黄色高清视频在线观看 | 最新的av网站 | 日韩精品一区二区免费视频 | 色视频在线免费 | 色综合久久精品 | 久久国产精品第一页 | 亚洲天堂网视频在线观看 | 毛片在线网 | 日p视频 | 欧美久久影院 | 成人黄色毛片 | 中文字幕乱码日本亚洲一区二区 | 一级淫片a | 少妇18xxxx性xxxx片 | 精品麻豆 | 91成人精品 | 国产视频 亚洲视频 | 久久人人爽人人片av | 波多野结衣亚洲一区二区 | 国产美女被啪进深处喷白浆视频 | 一级片视频在线 | 狠狠色噜噜狠狠狠 | 久久免费国产 | 狠狠干 狠狠操 | 日日摸日日添日日躁av | 中文字幕乱视频 | av电影一区二区三区 | 99综合影院在线 | 午夜精品99久久免费 | 天天插视频 | 四虎永久精品在线 | 国产一区二区久久 | 午夜精品麻豆 | 东方av在 | 国产免费高清视频 | www.夜夜爱 | 少妇激情久久 | 国产xx视频| 成人av播放 | 99精品视频免费观看视频 | 久久成人毛片 | 婷婷婷国产在线视频 | 99久久久久国产精品免费 | 色综合天天综合网国产成人网 | 高清有码中文字幕 | 欧美激情xxxx性bbbb | 黄色特级一级片 | 亚洲精品观看 | 国产免费高清视频 | 中文字幕在线看片 | 久久精品中文 | 六月丁香婷婷久久 | 一区二区三区高清在线观看 | 91香蕉视频 | 日韩成人高清在线 | 久久久久免费精品国产 | 国产九九九视频 | 久久精品视频播放 | 中文在线免费看视频 | 最新国产视频 | 2024国产精品视频 | 欧美福利网址 | 日韩午夜三级 | 国产小视频在线免费观看视频 | 欧美日韩裸体免费视频 | 久久精品欧美 | 99国产视频在线 | 国产精品免费看久久久8精臀av | 久久天天操 | 欧美天天干 | 西西大胆免费视频 | www.天天操 | 高清久久久久久 | 亚洲视频电影在线 | 日韩视频www | 在线亚洲观看 | 国内成人av | 免费看黄色大全 | 国产手机视频在线观看 | 欧美性猛片, | 人人澡超碰碰 | 91成人免费看片 | www.久久久精品| 国产尤物视频在线 | 精品一区二区电影 | 黄色软件在线观看免费 | 视频在线观看入口黄最新永久免费国产 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 亚洲免费永久精品国产 | 国产黄色a | 久久久综合色 | 亚洲精品美女久久久久网站 | 免费看国产曰批40分钟 | 激情影院在线观看 | 三级视频国产 | 在线国产精品视频 | 91高清在线 | 成人免费观看视频网站 | 国内精品小视频 | 久草在线手机观看 | 久久精品站 | 国产中文字幕亚洲 | 国产日韩欧美在线观看 | 高清中文字幕av | 性色av免费观看 | 国产一级免费播放 | 中文字幕高清视频 | 激情欧美一区二区三区 | 91九色蝌蚪视频 | 国产精品免费观看国产网曝瓜 | 91精品成人久久 | 亚洲无人区小视频 | 免费三级a | 日韩有码在线观看视频 | 亚洲精品国产精品国自产在线 | 97激情影院 | 婷婷日日 | 视频99爱 | 在线高清av| 国产精品无av码在线观看 | 99免在线观看免费视频高清 | 不卡电影免费在线播放一区 | 国产伦精品一区二区三区… | 黄色小视频在线观看免费 | 精品久久一区二区三区 | 国产精品久久婷婷六月丁香 | 人人干免费 | 欧美与欧洲交xxxx免费观看 | 免费观看日韩 | 99久久精品日本一区二区免费 | japanesexxxhd奶水 国产一区二区在线免费观看 | 国产精品一区二区久久精品爱微奶 | 99视频在线免费观看 | 欧亚日韩精品一区二区在线 | 日韩在线国产 | 毛片基地黄久久久久久天堂 | 在线观看视频免费播放 | 国产精品一区二区美女视频免费看 | 91精品国产入口 | 在线观看视频中文字幕 | 久久免费在线 | 久久综合9988久久爱 | 久久精品久久久久 | 成人黄色在线 | 午夜手机电影 | 国产流白浆高潮在线观看 | 在线日韩av | 中文字幕第 | 午夜国产福利视频 | 亚州精品天堂中文字幕 | 国产精品视频全国免费观看 | 中文字幕高清在线播放 | 日韩理论在线视频 | 蜜臀av麻豆 | 亚洲妇女av | 亚洲经典精品 | 久色伊人 | 天天干天天操av | 国产午夜小视频 | 亚洲电影院 | 亚洲婷婷免费 | 国产无遮挡又黄又爽在线观看 | 国产精品一区二区免费 | 97激情影院 | 欧美成年人在线视频 | 一区二区三区 中文字幕 | 日日干夜夜骑 | 久青草视频 | 国语精品久久 | 久久99精品一区二区三区三区 | 国产淫片 | 日韩视频在线观看视频 | 久热超碰| 五月激情在线 | 麻豆一精品传二传媒短视频 | 欧美乱大交 | 狠狠干天天干 | 国产精品毛片一区二区三区 | 久久久久久福利 | 亚洲成人一区 | 亚洲做受高潮欧美裸体 | 极品国产91在线网站 | 国产99久久久欧美黑人 | 日本精品xxxx | a视频免费在线观看 | 国产精品99久久久久久久久久久久 | 日本黄色大片免费看 | 中文字幕亚洲欧美日韩 | 9999精品 | 欧美精品在线免费 | 亚洲日本在线视频观看 | 中文字幕第一页在线视频 | 天堂麻豆| 五月婷婷黄色 | 久久一本综合 | 欧美日韩精品久久久 | 麻豆传媒一区二区 | 国产高清视频在线观看 | 欧美色综合 | 草久久精品 | japanese黑人亚洲人4k | 国产精品免费看久久久8精臀av | 国产精品乱码久久久 | 欧美精品久久久久久久亚洲调教 | 久久综合之合合综合久久 | 国产精品a久久久久 | 久久男女视频 | 日韩av片免费在线观看 | 免费色婷婷| 在线观看av免费 | 久久久久亚洲天堂 | 综合网色 | 国产99久久九九精品免费 | 色多多在线观看 | 中文字幕在线看片 | 免费在线一区二区 | 午夜一级免费电影 | 99在线免费观看 | 91免费高清观看 | 五月婷婷色丁香 | 欧美-第1页-屁屁影院 | 91麻豆精品国产 | 国产探花视频在线播放 | 日韩理论在线播放 | 99精品久久只有精品 | 美女国内精品自产拍在线播放 | 在线观看黄色小视频 | 99精品视频在线观看免费 | 亚洲人视频在线 | 97成人在线观看 | 在线中文字幕电影 | av线上看| 日韩av成人免费看 | www.777奇米| 国产女教师精品久久av | 国产精品高清一区二区三区 | 特级aaa毛片| 国产精品 亚洲精品 | 一区二区三区免费在线观看视频 | 婷婷丁香色 | 91一区啪爱嗯打偷拍欧美 | 久久久久久久久艹 | 91超碰在线播放 | 免费在线观看av片 | 成人国产精品一区 | 欧美一级片在线免费观看 | 手机看片午夜 | 乱男乱女www7788| 久久久影片 | 色婷婷色 | 日韩三级一区 | 手机看片 | 色www精品视频在线观看 | 久久久亚洲国产精品麻豆综合天堂 | 久久综合射 | 色婷婷骚婷婷 | 精品 激情 | 欧美色婷| 视频在线亚洲 | 久久综合一本 | 精品视频免费播放 | 成人黄色在线电影 | 欧美在线18 | 色老板在线| 国产精品一区在线播放 | 丁香在线| 久草剧场 | 日日干夜夜干 | 久久久久久欧美二区电影网 | 成人一级电影在线观看 | www.色爱| 日韩欧美高清视频在线观看 | 欧美伦理电影一区二区 | 天天搞天天 | 成人小视频在线 | 五月婷婷六月丁香在线观看 | 亚洲,国产成人av | 久久草草影视免费网 | 精品999在线观看 | 91在线观看黄 | 中文字幕免费观看全部电影 | 久久久精品免费看 | 色午夜| 亚洲欧美日韩不卡 | 国产视频99 | 国产成人福利 | 中文字幕在线有码 | 97超碰中文字幕 | 久久人人爽人人爽人人片av软件 | 国产最顶级的黄色片在线免费观看 | 999久久久久久久久久久 | 国内精品久久久久久久影视麻豆 | 人人澡人人草 | 91秒拍国产福利一区 | 国产日韩在线播放 | 人人要人人澡人人爽人人dvd | 久久久久久久久久久成人 | 国产精品久久久久影院日本 | 高清在线观看av | 国产精品久久一区二区三区不卡 | 美女av免费 | 色综合天天色综合 | 日韩中文在线视频 | 日本mv大片欧洲mv大片 | 日b视频在线观看网址 | 黄色一级免费网站 | 日韩在线观看视频网站 | 91激情视频在线观看 | 国产在线观看91 | 中文字幕欧美三区 | 成人av久久 | 人人草在线视频 | 久久久久亚洲精品男人的天堂 | 亚洲黄色在线 | 久久久久久久久久久久电影 | 人人澡人人爱 | 99免在线观看免费视频高清 | 午夜美女视频 | 天天操月月操 | 亚洲精品看片 | 亚洲丝袜中文 | 91亚洲永久精品 | 日日爱夜夜爱 | 成人资源在线观看 | 欧美做受高潮 | 国产一区麻豆 | 亚洲精品网址在线观看 | 在线导航av | 欧美日韩在线免费观看视频 | 亚洲 中文 在线 精品 | 国产精品久久久久久久久软件 | 精品视频不卡 | 日韩在线观看视频在线 | 九色91在线视频 | 久久久久女人精品毛片 | 中文字幕在线看人 | 国产精品免费在线视频 | 92精品国产成人观看免费 | 免费三级影片 | 免费毛片一区二区三区久久久 | 婷婷六月综合网 | 国产一区二区三精品久久久无广告 | 国产精品久久久久永久免费观看 | 国产糖心vlog在线观看 | 久久99影院 | 日本中文字幕久久 | 国产高清99 | 国产一级片在线播放 | 就操操久久| 国产成人精品一区二区三区福利 | 91精品国产综合久久久久久久 | 91夜夜夜| 国产精品久久久久久久久搜平片 | 免费看黄20分钟 | 激情综合五月婷婷 | 亚洲视频久久久 | 人人干人人做 | 亚洲精品男人的天堂 | 国产成人一区二区在线观看 | 亚洲欧美久久 | 精品久久一二三区 | 热久久免费视频 | 中文字幕 国产精品 | 91大神精品视频在线观看 | 91在线中文字幕 | 欧美嫩草影院 | 午夜18视频在线观看 | 制服丝袜一区二区 | 亚洲美女视频在线观看 | 亚洲精品国偷自产在线99热 | a'aaa级片在线观看 | 激情伊人五月天久久综合 | 成人av资源在线 | 日韩免费看片 | 欧美性生爱 | 8x成人免费视频 | 久久久久高清 | 深爱婷婷久久综合 | 国产二级视频 | 91精品黄色 | 欧美精品国产综合久久 | 国产精品久久久网站 | 国产精品久久电影网 | 免费日韩一区二区三区 | 性色在线视频 | 成人蜜桃| 亚洲精品mv在线观看 | 成年人免费av | 亚洲情婷婷 | 日日碰狠狠添天天爽超碰97久久 | 日韩在线免费看 | 天天操天天操天天操天天操天天操天天操 | 日本午夜在线观看 | 国产女人40精品一区毛片视频 | 伊人精品在线 | 美女黄频在线观看 | 六月丁香综合网 | 在线 国产 日韩 | 国产亚洲欧美在线视频 | 国产成人久久av977小说 | 高清色免费 | 国产免费视频一区二区裸体 | 国产精品毛片久久久久久 | 国产香蕉视频在线观看 | 久久久综合九色合综国产精品 | 能在线看的av | 精品国产亚洲日本 | 999色视频| 国产精品福利在线播放 | 色婷婷福利 | 国产美女主播精品一区二区三区 | 在线草| 成人精品国产 | 91日韩在线专区 | www.天天射.com | 婷婷综合 | 国产一区二区久久精品 | 9ⅰ精品久久久久久久久中文字幕 | 成人福利在线观看 | 操操操天天操 | 在线国产中文字幕 | 四虎伊人 | 久久这里只有精品视频99 | 亚洲精品一区二区在线观看 | 精品综合久久久 | 91九色视频观看 | 国产精品av一区二区 | 蜜臀aⅴ国产精品久久久国产 | 亚洲高清激情 | 国产亚洲精品久久19p | 国产不卡视频在线 | 国产麻豆果冻传媒在线观看 | 日韩精品一区二区在线观看视频 | 最近字幕在线观看第一季 | 国产亚洲精品久久久久动 | 一二三区av | 涩涩色亚洲一区 | 精品久久福利 | 一级黄色片毛片 | 日本在线成人 | 日韩91av | 99久久99久久精品 | 欧美日韩中文在线视频 | 深夜免费小视频 | a视频在线 | 欧美日韩免费在线视频 | 99高清视频有精品视频 | 中文字幕免费高清av | 亚洲第一区在线观看 | 青青河边草免费 | 久久九九久久九九 | 欧美精品在线免费 | www.夜夜操.com| 99精品视频中文字幕 | 免费a视频 | 日韩高清免费无专码区 | a级黄色片视频 | 黄色影院在线免费观看 | 亚洲精品成人av在线 | 日本在线h | 久久久免费观看完整版 | 日韩一级成人av | 成人羞羞视频在线观看免费 | 97视频免费在线看 | 亚洲国产一区二区精品专区 | 99一级片 | 最近中文字幕 | 国产一区二区高清 | 91在线看黄 | 日韩在线观看av | 精品国产aⅴ麻豆 | 激情久久久 | 天天爱天天色 | 中文字幕影片免费在线观看 | 成年人黄色免费视频 | 夜夜澡人模人人添人人看 | 国产色婷婷在线 | 日批视频在线观看免费 | 综合激情 | 97国产精品 | 国产精品一区二区久久 | 中文亚洲欧美日韩 | 国产精品大片免费观看 | 欧美精品国产精品 | 操高跟美女 | 91色国产| 国产视频亚洲视频 | 国产精品久久久久久久免费大片 | a v在线观看 | 久久伊人婷婷 | 国产精品久久久久久久久久不蜜月 | 久久这里只有精品久久 | 欧美日韩午夜在线 | 麻花豆传媒一二三产区 | 在线看一级片 | 精品a在线 | 国产福利一区二区在线 | 亚洲综合成人婷婷小说 | 成人免费在线播放 | 韩国精品福利一区二区三区 | 色综合久久久久久久 | 在线电影av | 亚洲性视频 | 欧美一区二区三区免费看 | 免费日韩一区 | 免费看三级黄色片 | 国产免费资源 | 激情伊人五月天 | 在线观看黄污 | 久久国产免费视频 | 欧美日韩性生活 | 97爱| 毛片无卡免费无播放器 | 午夜精品电影 | 亚洲天天干 | av免费在线观看网站 | 91理论片午午伦夜理片久久 | 日韩精品视频免费在线观看 | 国产精品日韩在线 | 98久9在线 | 免费 | 久草爱 | 久久人人爽人人爽人人片av软件 | 99久久毛片 | 欧美一区二区三区特黄 | 亚洲精品中文在线 | 日韩高清在线一区二区三区 | 一性一交视频 | 久久久国产精品免费 | 国产精品久久久久一区二区国产 | av在线播放亚洲 | 91麻豆精品91久久久久同性 | 欧美 日韩 国产 中文字幕 | 久草精品网 | 人人草在线观看 | 精品自拍sae8—视频 | 人人爽人人做 | 日韩av不卡播放 | 不卡的av电影 | 久久久久看片 | 超碰日韩 | 成人av久久 | 亚洲闷骚少妇在线观看网站 | 久久免费国产精品1 | 一本一本久久a久久精品综合小说 | 毛片无卡免费无播放器 | 国产免费影院 | 久久在草| 一区二区三区日韩在线 | 97精品国产一二三产区 | 国产精品igao视频网网址 | 国产精品资源在线观看 | 国产网红在线观看 | 九九99| 久久免费电影网 | 欧美激情精品久久久久久免费印度 | 久久人人爽人人爽人人片av免费 | 久久精品免费电影 | 射射射综合网 | 国产玖玖在线 | 日批在线观看 | 在线视频欧美精品 | 91精品国产99久久久久久红楼 | 操久久网 | 丁香花中文在线免费观看 | 国产99久久99热这里精品5 | 国产1区2区3区精品美女 | 六月婷操 | 天天拍天天色 | 国产精品久久久久久久久久久杏吧 | 91精品国产麻豆国产自产影视 | 黄色小说免费在线观看 | 国产香蕉视频在线播放 | 高清在线观看av | 精品在线观看一区二区 | 久久久久久国产精品美女 | 成人一级电影在线观看 | 黄色午夜 | 亚洲精品乱码久久久久久按摩 | 国产日韩在线播放 | 少妇bbbb搡bbbb桶 | 韩国av不卡 | 中文字幕精品一区久久久久 | 天天干天天天天 | 日日干干夜夜 | www.天天射.com | 国产黄免费看 | 中文字幕av在线不卡 | www.99在线观看 | 日韩黄色中文字幕 | 亚洲视频在线观看网站 | 日本夜夜草视频网站 | 天天操福利视频 | 91精品国产乱码久久 | 手机看片国产日韩 | 天天操天天爱天天干 | 五月婷婷综合久久 | 久草精品资源 | 亚洲精品av中文字幕在线在线 | 久久激情综合网 | 四虎国产永久在线精品 | 日韩色一区二区三区 | 天天爱综合 | 国产区精品区 | 在线观看av网 | 成人h在线播放 | 日韩欧美一区二区三区在线观看 | 久久不射网站 | 亚洲 在线 | 国产青草视频在线观看 | 一区二区电影在线观看 | 亚洲欧美少妇 | 国产裸体视频网站 | 日韩久久在线 | 免费在线观看成年人视频 | 国产一二区精品 | 成av人电影 | 肉色欧美久久久久久久免费看 | 欧美日韩视频在线一区 | 日韩一区二区三区在线看 | 免费观看成人网 | 91在线免费公开视频 | 国产精品久久久久久电影 | 久久99国产精品久久99 | 国产高清在线观看 | 999视频网站 | 999精品在线 | 久久xxxx | 亚洲1区在线 | 亚州精品天堂中文字幕 | 日本黄色黄网站 | 久久久久久激情 | 欧美午夜久久 | 黄色天堂在线观看 | 97av在线视频免费播放 | 中文字幕一区二区三区视频 | 中文在线8新资源库 | 日韩免费看的电影 | 午夜12点 | 在线a人v观看视频 | 99久久精品午夜一区二区小说 | 久久99国产精品免费网站 | 精品视频免费播放 | 国产成年免费视频 | 久久成人高清 | 日日爱av| 久久av一区二区三区亚洲 | 三上悠亚一区二区在线观看 | 欧美精品一区在线发布 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 精品国产网址 | 日韩免费高清 | 亚洲视频在线看 | 免费av大全| 人人干人人草 | 福利视频网站 | 奇米先锋| 免费无遮挡动漫网站 | www夜夜操com | 国产亚洲视频中文字幕视频 | 黄色软件在线看 | 日本免费久久高清视频 | 美女视频黄免费的 | 免费福利小视频 | 手机av在线免费观看 | 黄色小说视频在线 | 999久久| 婷婷视频导航 | 久久激情电影 | 热99久久精品 | 久久国产精彩视频 | 精品视频免费 | 久在线| 丁香久久 | 91福利视频在线 | www蜜桃视频 | 亚洲精品视频免费 | 中文字幕一区二区三区在线播放 | 99精品在线观看视频 | 免费观看黄色av | 色婷婷激情四射 | 手机版av在线| 热久久免费视频精品 | 日韩欧美国产视频 | 精品欧美一区二区精品久久 | 日韩高清精品免费观看 | 人人爽人人爽 | 久久99精品久久久久久三级 | 国产精品va在线观看入 | 国产成人黄色网址 | 一级片免费观看 | 国产精品一区二区精品视频免费看 | 一区二区三区av在线 | 天天干天天操天天操 | 久久久国产影视 | 久久99久久99精品免费看小说 | 在线日韩视频 | 91九色精品女同系列 | 亚洲视频99 | 亚洲激情视频在线 | 免费看色网站 | 婷婷在线网站 | 在线看v片成人 | 中文字幕色在线 | 久久免费视频网站 | 久久日本视频 | 日韩精品在线视频免费观看 | 成人一级片免费看 | 成人app在线播放 | 天天干天天操天天做 | 亚洲精品在线视频播放 | 久久99精品久久久久久三级 | 97色在线观看免费视频 | 日韩二区三区 | 免费裸体视频网 | 色窝资源 | 亚洲黄电影 | 在线免费av播放 | 免费a网站| 美女黄网久久 | 九九免费在线观看视频 | 超碰97在线资源 | 国产视频2区| 狠狠的操你 | 午夜视频导航 | 亚洲影视资源 | 看黄色.com | 天天操夜夜曰 | 国产视频亚洲精品 | 中文字幕在线观看视频一区 | 天天操天天干天天操天天干 | a级国产乱理伦片在线观看 亚洲3级 | 色视频网页| 亚州视频在线 | 日韩不卡高清 | 色久五月| 在线观看v片 | 中文有码在线视频 | 狠狠干婷婷色 | 欧美性高跟鞋xxxxhd | 日韩中文字幕在线不卡 | 91av观看 | 久久99国产视频 | 18做爰免费视频网站 | 九九欧美| 欧美一二三区在线观看 | 香蕉视频4aa | 伊人国产在线播放 | 欧美综合在线观看 | 亚洲精品国产第一综合99久久 | 日韩免费视频播放 | 久久高清片 | 免费亚洲婷婷 | 国产精品大片在线观看 | 欧美成人精品三级在线观看播放 | 女人18毛片90分钟 | 久久免费公开视频 | 色婷婷精品 | 日韩在线精品一区 | 日韩免费网站 | 在线观看视频一区二区三区 | 看国产黄色大片 | 国产福利精品一区二区 | 激情五月激情综合网 | 色网站在线免费观看 | 日本中文字幕系列 | av一级久久 | 国产成人福利片 | 免费三级在线 | 欧美亚洲久久 | 人人插人人玩 | 天天艹天天操 | 国产又黄又爽又猛视频日本 | 免费高清无人区完整版 | 日韩欧美成 | 亚洲免费视频在线观看 | 国产精品乱码一区二三区 | 亚洲国产成人精品在线观看 | av免费片 | 伊人电影在线观看 | 91在线精品视频 | 亚洲精品在线视频观看 | 久久三级视频 | 国产精品免费视频一区二区 | 日韩av中文字幕在线免费观看 | 国产二区免费视频 | 91精品国产自产在线观看永久 | 日韩免费看视频 | 免费成人av在线 | 日韩欧美电影 | 嫩草av在线 | 极品久久久久 | 欧美国产日韩一区二区三区 | 婷婷精品国产欧美精品亚洲人人爽 | 成人观看视频 | 久久电影国产免费久久电影 | 日韩高清国产精品 | 成人高清在线 | 日韩在线观看你懂的 | 精品国产一区二区三区蜜臀 | 国产精品 中文在线 | 成人av免费在线 | 在线电影 你懂得 | 国产精华国产精品 | 欧美日韩国产伦理 | 婷婷在线免费观看 | 日韩久久久久久久久久久久 | 97免费公开视频 | 成人毛片在线观看 | 毛片在线播放网址 | 337p日本欧洲亚洲大胆裸体艺术 | 欧美乱码精品一区 | 亚洲欧洲精品在线 | 精品国内自产拍在线观看视频 | 久久免费视频99 | 久久婷亚洲五月一区天天躁 | 欧美另类性 | 亚洲 欧美 日韩 综合 | 天天看天天干 | 婷婷丁香激情网 | 久久久久久久久久久久久久av | 在线午夜电影神马影院 | 亚洲精品久久久蜜桃 | 欧美日韩精品在线视频 | 国产精品九九九九九九 | 国产人成一区二区三区影院 | 免费97视频| 在线中文日韩 | 国产拍揄自揄精品视频麻豆 | 91av在线电影 | 国产精品99免费看 | 成人av午夜| 国产高清精| 久久久不卡影院 | 国产精品第二页 |