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

JavaScript 中的 Symbol 大揭秘

開發(fā) 前端
上個月有部分前端友友私信小編咨詢 JavaScript 中 Symbol 怎么使用的呢?在哪些應用場景下會用到這個Symbol?有哪些內置屬性?等等。問的問題五花八門,今天無意中翻到《JavaScript 權威指南》這本書集中有幾頁詳細解讀——Symbol 。

上個月有部分前端友友私信小編咨詢 JavaScript 中 Symbol 怎么使用的呢?在哪些應用場景下會用到這個Symbol?有哪些內置屬性?等等。問的問題五花八門,今天無意中翻到《JavaScript 權威指南》這本書集中有幾頁詳細解讀——Symbol 。

所以小編決定出一期關于Symbol 讀后感的文章來深入解讀它。閑話少說,直接進入主題。

Symbol 前身

ES5的對象屬性名都是字符串,這很容易造成屬性名的沖突。 比如,你使用了一個他人提供的對象,但又想為這個對象添加新的方法,新方法的名字就有可能與現(xiàn)有方法產生沖突。如果有一種機制,保證每個屬性的名字都是獨一無二的就好了,這樣就從根本上防止屬性名的沖突。這就是ES6引入的Symbol的原因。

ES6引入了一種新的原始數(shù)據類型Symbol,表示獨一無二的值。它是JavaScript語言的第七種數(shù)據類型,前六種是:undefined、null、布爾值(Boolean)、字符串(String)、數(shù)值(Number)、對象(Object)。

Symbol值通過Symbol函數(shù)生成。這就是說,對象的屬性名現(xiàn)在可以有兩種類型,一種是原來就有的字符串,另一種就是新增的Symbol類型。凡是屬性名屬于Symbol類型,就都是獨一無二的,可以保證不會與其他屬性名產生沖突。

在JavaScript誕生之初,對象屬性只能使用字符串作為鍵,這導致了一些問題。例如,當兩個不同的對象試圖使用相同的字符串作為屬性名時,可能會導致屬性名沖突。此外,JavaScript中沒有一種簡單的方法來實現(xiàn)私有屬性或方法。

其實對于Symbol的追溯早在Lisp語言中就有體現(xiàn):

(setq e (intern "echa-symbol"))

這里其實就是創(chuàng)建了一個名為 echa-symbol 的符號對象,并將其賦值給變量e。

另外,ES6引入Symbol其實離不開Ruby的身影,在Ruby中,可以使用冒號(:)來創(chuàng)建符號。冒號后面跟著符號的名稱,如:

:echa-symbol

可以看到其實Ruby的語法更加簡潔,定義和使用都是用冒號區(qū)分:

person = {
'name' => 'Echa',
'age' => 35,
:gender => 'Male'
}
puts person[:gender] # 輸出:'Male'

所以,在這樣的需求背景下,ES6在首批特性中包含了Symbol也不足為奇了。

Symbol 介紹

Symbol是ES6中新增的一種原始數(shù)據類型, 被劃分到了基本數(shù)據類型中基本數(shù)據類型: 字符串、數(shù)值、布爾、undefined、null、Symbol 引用數(shù)據類型: Object。

例如 number, boolean或者null,它們通常用于避免屬性名稱沖突,或模擬 JavaScript 對象的私有值。

您可以通過調用全局函數(shù)來創(chuàng)建 Symbol():

const sym = Symbol();

Symbol() 函數(shù)接受一個參數(shù),一個字符串 description 打印 Symbols 時會顯示。

const sym = Symbol('my description');
console.log(sym);
// Prints "Symbol(my description)"

主要特征

Symbols 有兩個關鍵特征。

第一個關鍵特征是 沒有兩個 Symbols 永遠相等 。 即使兩個 Symbols 具有相同的描述,它們也不相等。

let s1 = Symbol('foo');
let s2 = Symbol('foo');

console.log(s1 === s2)
//false

第二個關鍵特性是 對象鍵可以是 Symbols。通常對象鍵只能是 Symbols 或字符串。

const test = Symbol('test');
const obj = {};
obj.test = 'hello';
obj[test] = 'world';
obj.test;
// 'hello'obj[test];
// 'world'

由于沒有兩個 Symbols 永遠相等,因此除非您有權訪問 Symbols,否則您無法訪問 Symbols 屬性。 這使得 Symbols 可以方便地創(chuàng)建只能在特定函數(shù)中訪問的隱藏值。

function addSymbol(obj) {  
const sym = Symbol('test');
obj[sym] = 'my hidden value';
return obj;
}
const obj = addSymbol({});
// No way to access obj[sym] here, unless you explicitly look
// into `Object.getOwnPropertySymbols()`.

Symbols 也被排除在外JSON.stringify()輸出,這使得它們非常適合存儲最終用戶不應該看到的純程序數(shù)據。

Symbol 值最顯著的用途是作為對象屬性的 key。而 ES6 之前,屬性的 key 只能是字符串(否則也會發(fā)生自動類型轉換)。key 為 Symbol 值的屬性無法使用點號(.)訪問,只能使用中括號([])。類似地,在對象字面值或類定義中,添加 key 為 Symbol 值的屬性需要借助計算屬性名的語法,如:

const MY_KEY = Symbol();
const FOO = Symbol();
let obj = {
[MY_KEY]: 123,
[FOO]() {
return 'bar';
}
};

JavaScript 模塊化后,在模塊中創(chuàng)建 Symbol 值并用作對象屬性 key,模塊作者可以自信地認為該屬性不會覆寫對象上已有的屬性。類似道理,如果模塊中使用了 Symbol key 的對象屬性,只要不把 Symbol 值導出,就可以確信其他模塊不會不經意地覆寫該屬性。

對于應用開發(fā)者,Symbol 可以有這樣的使用場景:你從某第三方代碼獲得了一個對象,你想在該對象上存儲自己的屬性,但該第三方代碼是不透明的,或者不受你控制,所以你無從得知第三方代碼會在該對象上設置什么屬性,此時就可以使用 Symbol key 屬性,既能確信不會和已有屬性沖突,也能確信第三方代碼不會意外地修改你設置的屬性:

const extension = Symbol('my extension symbol');
let o = {
[extension]: {/* 將擴展數(shù)據存儲于該對象*/}
};
o[extension].x = 0; // 無論怎樣都不可能和 o 的其他屬性產生沖突。

以上場景還可表述為給對象關聯(lián)一個值,但存儲關聯(lián)值的鍵名希望從機制上防止和其他屬性名沖突。另外也可用 WeakMap 存儲對象到其關聯(lián)值的映射,兩種方法的異曲同工之處是:當對象本身消亡時,該映射關系也隨之消亡。

然而,必須知道的是,Symbol key 屬性并不是一種安全機制,第三方代碼仍然可以調用
Object.getOwnPropertySymbols(o) 獲得對象上的 Symbol key 屬性,改變屬性值,但此時就是第三方庫有意為之,而不是不經意的行為了,但這應該會在其文檔上有所提及才對。

Symbol 使用注意事項

  • Symbol是基本數(shù)據類型!?。?!不要加new哦
  • 后面括號可以傳入一個字符串,只是一個標記,方便我們閱讀,沒有任何意義
  • 類型轉化的時候不可轉化為數(shù)值
//只能轉化為字符串和布爾值
console.log(String(name));
console.log(Boolean(name));
console.log(Number(name))
  • 不能做任何運算
let name=Symbol('Echa');
console.log(name+111)
console.log(name+'ccc')
//全部報錯
  • symbol生成的值作為屬性或者方法的時候,一定要保存下來,否則后續(xù)無法使用
let name=Symbol('name');
let obj={
// name:'lnj',
[Symbol('name')]:'lbj'
}
console.log(obj.name);
//訪問不到,因為 [Symbol('name')]又是一個新的值,和上面的name不是同一個
  • for循環(huán)遍歷對象的時候是無法遍歷出symbol的屬性和方法的 Object.getOwnPropertySymbols()
et name=Symbol('name');
let obj={
[name]:'lnj',
age:12,
teacher:'wyx'
}
for(let key in obj){
console.log(key) //只能打印出age和teacher
}
//這個方法可以單獨取出Symbol(name)
console.log(Object.getOwnPropertySymbols(obj))

Symbol 的應用場景

  • 在企業(yè)開發(fā)中如果需要對一些第三方的插件、框架進行自定義的時候可能會因為添加了同名的屬性或者方法, 將框架中原有的屬性或者方法覆蓋掉為了避免這種情況的發(fā)生, 框架的作者或者我們就可以使用Symbol作為屬性或者方法的名稱。
  • 消除魔術字符串

魔術字符串:在代碼之中多次出現(xiàn)、與代碼形成強耦合的某一個具體的字符串或者數(shù)值。風格良好的代碼,應該盡量消除魔術字符串,改由含義清晰的變量代替。

const gender = {
//這樣就說明man就是一個獨一無二的值,不用再man:'man'
man: Symbol(),
woman: Symbol(),
}
function isMan(gender) {
switch (gender) {
case gender.man:
console.log('男性');
break;
case gender.woman:
console.log('女性');
break
}
}
isMan(gender.man) //男性
  • 為對象定義一些非私有的、但又希望只用于內部的方法。

由于以 Symbol 值作為鍵名,不會被常規(guī)方法遍歷得到。我們可以利用這個特性,為對象定義一些非私有的、但又希望只用于內部的方法。

注意:symbol并不能實現(xiàn)真正的私有變量的效果,只是不能通過常規(guī)的遍歷方法拿到symbol類型的屬性而已

再來復習一下對象的遍歷方法

  1. for (let xx in obj) :i代表key
  2. for (let xx of obj):不是自帶的哈
  3. Object.keys(obj) :返回包含key的數(shù)組
  4. Object.values(obj) :返回包含value的數(shù)組
  5. Object.getOwnPropertyNames() :返回包含key的數(shù)組

上述的所有方法都是遍歷不到symbol類型的(注意,是遍歷時取不到symbol,并不是說我們訪問不到對象的symbol類型)

可以遍歷到symbol的方法:

  • Object.getOwnPropertySymbols() :返回對象中只包含symbol類型key的數(shù)組
  • Reflect.ownKeys() :返回對象中所有類型key的數(shù)組(包含symbol)
let _password = Symbol('password')
const obj = {
name: 'Echa',
gender: 'male',
[_password]: '123456'
}
for (let item in obj) {
console.log(item);
}
console.log(Object.keys(obj));
console.log(Object.values(obj));
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.getOwnPropertySymbols(obj));
console.log(Reflect.ownKeys(obj))
// 輸出123456,所以還是可以直接訪問到symbol類型的屬性,
//所以symbol并不能真正實現(xiàn)私有變量的設定,
//所以一般只用于定義一些非私有的、但又希望只用于內部的方法
console.log(obj[_password]);

Symbol 名下哪些屬性?

在 JavaScript 中,Symbol 是一種非常特殊的數(shù)據類型,可以用來表示獨一無二的值。每個 Symbol 值都是唯一的,一般可以作為對象屬性的標識符使用,這些屬性稱為 Symbol 屬性,它們不會與其他屬性產生命名沖突,所以可以用于實現(xiàn)一些高級特性和語言擴展。

Symbol 還有一些內置屬性,比如 Symbol.iterator、Symbol.toPrimitive 和 Symbol.toStringTag 等,它們在實現(xiàn)一些特殊的需求(比如自定義對象的迭代、類型轉換和字符串描述時)非常有用,今天我們就來一起看一下 Symbol 內置屬性的一些妙用,看看你知道幾個?

Symbol.iterator

Symbol.iterator 可以讓我們定義一個對象默認的迭代器。

有什么用途呢?正常的對象一般都是不可迭代的,如果我們直接用 for of 遍歷一個對象,會拋出異常:TypeError: obj is not iterable ,因為對象默認是不可迭代的。

我們可以用 for in 來做遍歷:

const obj = { name: 'ConardLi', age: 17 };

for (const key in obj) {
if (Object.hasOwnProperty.call(obj, key)) {
const element = obj[key];
console.log(key, element);
}
}

但是如果我們開發(fā)的是一個自定義的數(shù)據結構,for in 可能就不那么好使了,比如現(xiàn)在有一個音樂播放器對象,我們需要實現(xiàn)一個自定義的播放列表,用于存儲用戶添加的歌曲。這個列表可以看作一個集合,其中每個元素代表一個歌曲,包含歌曲的名稱、作者、時長等屬性。

這時我們就可以通過定義 Symbol.iterator 方法,讓這個列表可以通過 for...of循環(huán)進行遍歷:

class Song {
constructor(name, artist, duration) {
this.name = name;
this.artist = artist;
this.duration = duration;
}
}

class Playlist {
constructor() {
this.songs = [];
}

addSong(song) {
this.songs.push(song);
}

[Symbol.iterator]() {
let index = 0;
const songs = this.songs;
return {
next: () => ({
value: songs[index++],
done: index > songs.length
})
}
}
}

const playlist = new Playlist();

playlist.addSong(new Song('Song 1', 'Artist 1', '3:45'));
playlist.addSong(new Song('Song 2', 'Artist 2', '4:20'));
playlist.addSong(new Song('Song 3', 'Artist 3', '5:10'));

for (const song of playlist) {
console.log(song.name);
}

// 輸出:
// "Song 1"
// "Song 2"
// "Song 3"

Symbol.toStringTag

默認情況下,我們在任何一個自定義的對象上調用 toString 方法,返回值都是下面這樣:

[object Object]

Symbol.toStringTag 可以被用來自定義對象的 toString 方法的返回值(注意不是重寫 toString 方法),這個特性在調試的時候非常有用,幫助開發(fā)者更方便地了解對象的類型信息:

class People {
constructor(name, age) {
this.name = name;
this.age = age;
}

get [Symbol.toStringTag]() {
return 'People';
}
}

const people = new People('ConardLi', 17);

console.log(people.toString()); // [object People]

Symbol.toPrimitive

?Symbol.toPrimitive 可以被用來自定義對象類型轉換時的行為。它可以接受一個 hint 參數(shù),用于指示對象應該被轉換成什么類型的值,比如 Number、String 或者其他默認的值。

舉一個實際的應用場景:假設我們正在開發(fā)一個日期處理工具,其中需要實現(xiàn)一個自定義的日期時間對象。這個對象包含日期時間的年月日時分秒等信息,這時候就可以用到 Symbol.toPrimitive 方法,來幫助我們自定義對象的類型轉換行為:

class MyDateTime {
constructor(year, month, day, hour = 0, minute = 0, second = 0) {
this._datetime = new Date(year, month - 1, day, hour, minute, second);
}

[Symbol.toPrimitive](hint) {
switch (hint) {
case 'number':
return this._datetime.getTime();
case 'string':
return this._datetime.toLocaleString();
default:
return this._datetime.toString();
}
}
}

const myDate = new MyDateTime(2023, 4, 8, 15, 30, 0);

console.log(myDate); // 輸出:Sat Apr 08 2023 15:30:00 GMT+0800 (中國標準時間)
console.log(myDate + 10000); // 輸出:1699950200000
console.log(`${myDate}`); // 輸出:"2023/4/8 下午3:30:00"

Symbol.asyncIterator

Symbol.asyncIterator 可以用來實現(xiàn)一個對象的異步迭代器,它可以用于遍歷異步數(shù)據流,比如異步生成器函數(shù)、異步可迭代對象等。這個特性在我們需要處理異步數(shù)據流時非常有用。

舉一個實際的應用場景:假設我們正在開發(fā)一個異步數(shù)據源處理器,其中包含了大量的異步數(shù)據,比如網絡請求、數(shù)據庫查詢等。這些數(shù)據需要被逐個獲取并處理,同時由于數(shù)據量非常大,一次性獲取全部數(shù)據會導致內存占用過大,因此需要使用異步迭代器來逐個獲取數(shù)據并進行處理:

class AsyncDataSource {
constructor(data) {
this._data = data;
}

async *[Symbol.asyncIterator]() {
for (const item of this._data) {
const result = await this._processAsyncData(item);
yield result;
}
}

async _processAsyncData(item) {
// 模擬異步處理數(shù)據的過程
return new Promise((resolve) => {
setTimeout(() => {
resolve(item.toUpperCase());
}, Math.random() * 1000);
});
}
}

async function processData() {
const dataSource = new AsyncDataSource(['a', 'b', 'c', 'd', 'e']);
for await (const data of dataSource) {
console.log(data);
}
}

processData();

Symbol.hasInstance

Symbol.hasInstance可以用于確定一個對象是否是某個構造函數(shù)的實例,它可以用來改變 instanceof 的行為:

class MyArray {
static [Symbol.hasInstance](instance) {
return Array.isArray(instance);
}
}

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

Symbol.species

Symbol.species 可以用于指定創(chuàng)建派生對象時要使用的構造函數(shù)。一個實際的需求場景可能是我們需要對一個類進行繼承,并且希望這個類的某些方法返回一個新的派生對象而不是基類的實例對象。下面是一個簡單的例子:

class MyArray extends Array {
static get [Symbol.species]() {
return Array;
}

test(){
console.log('test');
}
}

const myArray = new MyArray(1, 2, 3);
const mappedArray = myArray.map(x => x * 2);
myArray.test();

console.log(mappedArray instanceof MyArray); // false
console.log(mappedArray instanceof Array); // true

Symbol.match

Symbol.match 可以用來確定使用 String.prototype.match 方法時要搜索的值,它可用于更改 match 類 RegExp 對象的方法行為,下面是一個實際實用案例:

class CustomRegExp extends RegExp {
[Symbol.match](str) {
const matches = super[Symbol.match](str);
if (matches) {
return matches.map(match => {
return `匹配到了: ${match}`;
});
}
return matches;
}
}

const regex = new CustomRegExp('hello', 'g');
const result = 'hello world'.match(regex);
console.log(result); // ["匹配到了: hello"]

Symbol.replace

S?ymbol.replace 可以幫我們更靈活的處理 String.prototype.replace 方法,比如我們可以自定義字符串的替換行為。

比如有這樣一個需求場景:我們有一個字符串處理庫,我們想自定義它的 replace 方法,讓它可以替換一個字符串的所有元音字母。這時候就可以用到 Symbol.replace :

const vowels = ['a', 'e', 'i', 'o', 'u'];

const customReplace = str => {
let result = '';
for (let i = 0; i < str.length; i++) {
if (vowels.includes(str[i])) {
result += '*';
} else {
result += str[i];
}
}
return result;
};

const customString = {
[Symbol.replace]: customReplace
};

const originalString = "hello world";

const result = originalString.replace(customString, '');

console.log(result); // outputs "h*ll* w*rld"

Symbol.split

Symbol.split 可以用來確定使用 String.prototype.split 方法執(zhí)行時具體要拆分的值。

一個實際需求場景:我們需要從文本中提取出所有的數(shù)字。但是文本中的數(shù)字可能包含在不同的字符和符號中,例如括號、分隔符和單位等。使用 Symbol.split 可以自定義分割符,這樣我們就可以根據自己的需求來對文本進行分割。

const customSplit = str => str.split(/[\s$¥€]+/);

const customRegExp = {
[Symbol.split]: customSplit
};

const string = "100$200¥300€400 500";

console.log(string.split(customRegExp)); // outputs [ '100', '200', '300', '400', '500' ]

Symbol.unscopables

Symbol.unscopables 通??梢杂脕肀苊庠谑褂?nbsp;with 語句時訪問對象中不希望被訪問的屬性。下面是一個示例,其中使用 with 語句訪問對象的某些屬性,但通過將這些屬性添加到 [Symbol.unscopables] 對象中,可以防止訪問:

const globalVars = {
a: 10,
b: 20,
[Symbol.unscopables]: {
b: true
}
};

with (globalVars) {
console.log(a); // 輸出 10
console.log(b); // 拋出 ReferenceError
}

最后

一臺電腦,一個鍵盤,盡情揮灑智慧的人生;幾行數(shù)字,幾個字母,認真編寫生活的美好;

一 個靈感,一段程序,推動科技進步,促進社會發(fā)展。

責任編輯:華軒 來源: 今日頭條
相關推薦

2010-01-22 14:53:21

2010-10-09 09:26:59

Array數(shù)組JS

2010-10-09 15:31:51

JavaScriptCookie

2021-05-13 23:30:17

JavaScript 原理揭秘

2017-07-05 16:43:52

VSAN加密虛擬化

2016-02-29 16:54:10

OpenStack混合云應用軟件定義基礎設施

2009-05-28 10:12:04

2017-07-06 08:21:27

VSAN加密虛擬機

2017-08-24 09:19:20

分解技術揭秘

2025-05-12 08:00:00

Expect腳本自動化運維

2010-07-15 17:56:08

2014-11-11 15:40:09

2013-08-05 11:34:02

2025-03-19 09:00:00

JavaScript代碼無限滾動

2020-12-28 09:50:50

Python內存管理語言

2010-08-09 09:56:12

FlexBuilder

2012-03-14 16:17:16

打印機常見問題

2010-05-20 18:52:06

Eclipse使用SV

2010-02-02 18:34:00

Python

2010-08-23 09:45:54

Windows Azu云計算微軟
點贊
收藏

51CTO技術棧公眾號

不卡av在线网站| 亚洲成国产人片在线观看| 国产精品久久久久久久久久| 国产三级黄色片| 亚洲超碰在线观看| 天天综合色天天| 亚洲精品久久区二区三区蜜桃臀 | 3d动漫精品啪啪一区二区竹菊| 影音先锋成人资源网站| 日韩电影在线观看完整版| 奇米精品一区二区三区在线观看一 | 欧美激情日韩| 一区二区三区www| 亚洲一区和二区| 国产精品久久久久久久久久齐齐| 亚洲黄色免费网站| 四虎影院一区二区三区 | 久久亚洲a v| 福利成人在线观看| av在线不卡观看免费观看| 国产欧美日韩免费看aⅴ视频| 亚洲国产精品午夜在线观看| 欧美aaaa视频| 亚洲欧美日韩国产中文专区| 欧美xxxx日本和非洲| 久久国产三级| 在线观看www91| 18岁网站在线观看| 日本高清在线观看视频| 中文一区在线播放| 久久精品国产精品青草色艺 | 久久久久久久极品| 欧美精品一级| 久久高清视频免费| 天堂av免费在线| 精品一二三区| 亚洲美女免费精品视频在线观看| 黑森林av导航| aaa国产精品| 欧美一区二区三区在线观看视频| 性色av一区二区三区在线观看| 国产极品视频在线观看| 亚洲伊人春色| 亚洲成人激情图| 成人免费播放视频| 欧美成人精品一级| 91精品国产黑色紧身裤美女| 午夜精品久久久久久久99热影院| 亚洲精品555| 在线观看中文字幕不卡| 久久久久久久少妇| 日韩不卡免费高清视频| 91福利精品视频| 国产又粗又长又大的视频| 韩国精品主播一区二区在线观看| 色噜噜狠狠色综合中国| 日本精品久久久久中文字幕| 欧洲一级精品| 欧美性猛交xxxx黑人交| 久久国产精品国产精品| 欧美日韩卡一| 欧美一级片免费看| 美国黄色一级视频| 久久99精品国产自在现线| 日韩h在线观看| 亚洲精品成人无码| 波多野结衣在线观看一区二区| 国产亚洲a∨片在线观看| 日本一二三不卡视频| 91亚洲一区| 欧美夫妻性生活xx| 毛片视频网站在线观看| 日韩高清不卡一区二区三区| 成人久久久久久久| 亚洲精品视频91| 2014亚洲片线观看视频免费| 视频一区免费观看| www免费在线观看| 五月激情六月综合| www.日日操| 成人全视频免费观看在线看| 日韩视频免费观看高清完整版在线观看 | 制服丝袜第二页| 一区二区三区在线资源| 亚洲а∨天堂久久精品9966| 国产手机在线观看| 天天色综合色| 97色在线观看| 这里只有精品免费视频| 国产精品一区二区三区乱码| 精品1区2区| 永久免费av在线| 亚洲一区二区三区四区在线免费观看| 精品中文字幕av| 日日夜夜综合| 亚洲国产小视频在线观看| 天天干天天舔天天操| 欧美精品啪啪| 国产日韩欧美在线看| 亚洲黄色av网址| 白嫩亚洲一区二区三区| 亚洲国产另类 国产精品国产免费| 全黄一级裸体片| 欧美喷水视频| 国产精品日韩在线播放| 欧美77777| 国产精品久久久久久久岛一牛影视| h无码动漫在线观看| 日本免费久久| 亚洲国产精品久久精品怡红院| 99久久久无码国产精品衣服| 国内精品久久久久久久97牛牛 | 国产a级片免费观看| 亚洲精品在线国产| 日韩亚洲精品电影| 日本中文字幕第一页| 国产91色综合久久免费分享| 亚洲一区二区精品在线| 无人区在线高清完整免费版 一区二| 精品国产乱码久久| 午夜精品福利在线视频| 青青草成人在线观看| 久久久久国产精品视频| 暖暖在线中文免费日本| 5566中文字幕一区二区电影| 国产一区二区三区精品在线| 亚洲欧美日本视频在线观看| 国产精成人品localhost| 在线观看麻豆| 欧美艳星brazzers| 国精品无码人妻一区二区三区| 亚洲第一毛片| 波多野结衣成人在线| 国产在线69| 欧美日韩一区中文字幕| 欧美激情久久久久久久| 日韩av电影免费观看高清完整版| 精品国产福利| 色在线视频观看| 日韩av网站电影| 欧美成人精品欧美一级乱黄| 成人av资源网站| 成人免费视频91| 深夜影院在线观看| 懂色av一区二区三区免费观看| youjizz.com亚洲| 免费一区二区三区四区| 色妞在线综合亚洲欧美| 在线免费一级片| 国产精品成人免费| 看看黄色一级片| 婷婷综合网站| 99在线影院| 高潮在线视频| 亚洲毛片一区二区| 无码日韩精品一区二区| 日本一区二区综合亚洲| 精品亚洲一区二区三区四区| 99久久婷婷| 91人人爽人人爽人人精88v| caopo在线| 精品国产免费人成在线观看| 99视频在线看| 久久久国产精品午夜一区ai换脸| www黄色在线| 亚洲a一区二区三区| 999在线免费观看视频| 精精国产xxxx视频在线中文版 | 国产精九九网站漫画| 日韩视频久久| 欧美综合77777色婷婷| 国产人妖一区| 欧美激情第一页xxx| 五月婷婷六月激情| 在线观看网站黄不卡| 日韩视频中文字幕在线观看| 国产 日韩 欧美大片| 无码人妻丰满熟妇区96| 色综合天天爱| 久久久最新网址| 国产在线视频资源| 69堂国产成人免费视频| 国产网址在线观看| 欧美激情在线一区二区| 免费高清视频在线观看| 国产精品主播| 中文字幕日韩精品久久| 精品精品国产三级a∨在线| 国产精品久久久久福利| 亚洲精品白浆| 亚洲图片在区色| 亚洲a视频在线| 在线观看欧美日本| 国产午夜福利一区二区| 国产精品污www在线观看| 最新国产精品自拍| 免费在线观看日韩欧美| 久久久久免费看黄a片app| 日韩欧美网站| 麻豆亚洲一区| 亚洲日本va午夜在线电影| 国产精品精品国产| 高潮在线视频| 美女精品久久久| 国产美女性感在线观看懂色av| 91精品国产综合久久蜜臀| 亚洲成人第一网站| 亚洲高清免费视频| 一区二区国产精品精华液| 久久亚洲精品小早川怜子| 国产精品嫩草69影院| 日本成人超碰在线观看| 丰满爆乳一区二区三区| 欧美午夜免费影院| avove在线观看| 日韩欧美一区免费| 欧美一区二区福利| 林ゆな中文字幕一区二区| 96成人在线视频| avtt久久| 成人福利视频在线观看| av一区在线播放| 国产极品精品在线观看| 亚洲优女在线| 91国内产香蕉| 3344国产永久在线观看视频| 欧美大胆a视频| 超碰在线观看免费版| 日韩资源在线观看| 91精彩视频在线观看| 亚洲人成电影在线播放| 三级在线观看| 日韩电视剧免费观看网站| 刘亦菲毛片一区二区三区| 日韩免费福利电影在线观看| 999精品国产| 4438成人网| 国产美女明星三级做爰| 欧美一级在线免费| 国产xxxx孕妇| 日韩欧美另类在线| 北条麻妃一二三区| 精品免费视频一区二区| 亚洲老妇色熟女老太| 欧美r级在线观看| 黄色三级网站在线观看| 亚洲国产精品成人va在线观看| 五月婷婷六月丁香| 亚洲欧美激情一区| 国产高清在线观看| 中文字幕日韩精品有码视频| avtt亚洲| 大胆欧美人体视频| 麻豆蜜桃在线| 91成人精品网站| 欧美一区国产| 成人动漫网站在线观看| 欧美精品影院| 激情视频在线观看一区二区三区| 日韩有码中文字幕在线| 欧美一区二区在线| 日韩伦理视频| 成人污网站在线观看| 亚洲黄色av| 乱子伦视频在线看| 久久99精品国产麻豆婷婷洗澡| 国产一区二区片| 亚洲国产一区二区精品专区| 欧美日韩一道本| 日本特黄久久久高潮| 在线免费观看av网| 成人av免费在线| 日本一级免费视频| 日韩理论片一区二区| 久久综合色综合| 日本丰满少妇一区二区三区| 亚洲无码久久久久| 欧美精品一区二区在线观看| 飘雪影院手机免费高清版在线观看| 中文字幕日韩av电影| 欧美黑人猛交的在线视频| 日本三级韩国三级久久| 亚洲成人1区| 精品一区久久久| 五月天久久网站| 国产一区二区网| 极品少妇一区二区三区精品视频| 国产ts在线观看| 国产精品免费丝袜| 国产极品美女高潮无套嗷嗷叫酒店| 在线亚洲免费视频| 亚洲精品无码专区| 日韩小视频网址| 亚洲天堂av在线| 2022国产精品| heyzo久久| 香港三级韩国三级日本三级| 久久99久久99| 国产精品久久久久无码av色戒| 亚洲欧美日韩小说| 亚洲 小说区 图片区| 亚洲第一区中文99精品| 黄色成人影院| 国产成人免费av| 精品欧美午夜寂寞影院| 老司机av福利| 丝袜脚交一区二区| 国产麻豆剧传媒精品国产av| 国产精品国产成人国产三级| 毛片毛片女人毛片毛片| 日韩精品影音先锋| 91亚洲欧美| 国产91网红主播在线观看| 风间由美中文字幕在线看视频国产欧美 | 美女被爆操网站| 成人欧美一区二区三区白人| 亚洲天堂一区在线| 亚洲精品ady| 蜜臀av在线播放| 91久久嫩草影院一区二区| 国产一区二区三区网| 国产一区二区视频播放| 国产69精品久久久久毛片| 四虎永久免费在线| 欧美精品在线观看一区二区| 国产精品一区二区婷婷| 青青a在线精品免费观看| gogo人体一区| 成人免费a级片| 国产精品亚洲一区二区三区在线| 开心激情五月网| 欧美日本乱大交xxxxx| xxxxx日韩| 久久久黄色av| 本网站久久精品| 五月天丁香综合久久国产| 天堂蜜桃一区二区三区 | 亚洲天堂成人在线观看| 亚洲视频在线观看免费视频| 中文字幕亚洲二区| 国产一区精品福利| 不卡中文字幕在线| 国产精品99久久久久久有的能看| 永久免费看片视频教学| 在线播放国产精品二区一二区四区| 欧美三级理伦电影| 国产精品爽黄69天堂a| 91综合网人人| 亚洲丝袜在线观看| 亚洲影院免费观看| 日本xxxxwww| 日本精品视频在线观看| 欧洲乱码伦视频免费| jizzzz日本| 亚洲婷婷在线视频| 性一交一乱一精一晶| 97精品一区二区三区| 亚洲老女人视频免费| 老司机午夜av| 国产精品初高中害羞小美女文| 国产精品久久久久久久成人午夜| 久久成人在线视频| 嗯用力啊快一点好舒服小柔久久| 97成人在线观看视频| 国产亚洲va综合人人澡精品| 中文字幕视频二区| 欧美美女18p| 伊人久久大香线蕉无限次| 国产免费人做人爱午夜视频| 国产精品理伦片| 亚洲精品喷潮一区二区三区| 欧美中文字幕第一页| 日本a口亚洲| 无码人妻一区二区三区免费n鬼沢| 亚洲不卡在线观看| 国产一级免费在线观看| 成人美女免费网站视频| 亚洲一级特黄| 人妻一区二区视频| 欧美一级久久久久久久大片| 日本三级一区| 中文字幕av导航| 94色蜜桃网一区二区三区| 中文字幕人妻色偷偷久久| 九色成人免费视频| 国产欧美日韩精品高清二区综合区| 久久精品国产露脸对白| 午夜精品久久久| 男女啪啪在线观看| 就去色蜜桃综合| 国产一区二区三区高清播放| 国产性猛交╳xxx乱大交| 另类天堂视频在线观看| 亚洲丝袜啪啪| 在线观看一区二区三区视频| 91久久精品一区二区| 欧美人与动牲性行为| 亚洲精品中文字幕乱码三区不卡| 成人性色生活片免费看爆迷你毛片| 中文字幕久久久久|