亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > JavaScript > 正文

JavaScript基礎篇(3)之Object、Function等引用類型

2024-05-06 16:25:32
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了JavaScript基礎篇(3)之Object、Function等引用類型的相關資料,需要的朋友可以參考下
 

閱讀目錄

Object類型

1、通過構造函數來創建
2、通過字面量表示法來創建對象

Array類型

同樣Array也有兩種創建方式:
如果我們想要打印數組中所有的值,直接打印數組的變量名就可以:
往數組添值:
棧方法、隊列方法:
 關于數組的排序:
 數組的一些操作方法:
查找位置方法
迭代方法

歸并方法

Date類型

RegExp類型

Function類型

三種表示法:

方法重載
函數內部屬性(arguments 和 this)

基本包裝類型

瀏覽器的內置對象
URI 編碼方法

總結

我們在《一步步學習javascript基礎篇(1):基本概念》中簡單的介紹了五種基本數據類型Undefined、Null、Boolean、Number和String。今天我們主要介紹下復雜數據類型(即引用數據類型)

Object類型

我們用的最多的引用類型就屬object類型了,一般用來存儲和傳輸數據是再好不過的。然,它的兩種創建方式我們是否了解呢?

1、通過構造函數來創建

如: var obj = new Object();

在js中的引用類型有個非常靈活的用法,可以動態的附加屬性和賦值。

如:

var obj = new Object();obj.name = "張三";//動態添加屬性并賦值obj.age = 23;alert(obj.name);

2、通過字面量表示法來創建對象

現在大家用得比較多的就是字面量表示法來創建對象了。

如:

var obj = { name: "張三", age: 23};alert(obj.age);

和上面的效果是等效的。通過這樣方式創建感覺結構更加的清晰,更加有封裝的感覺。:)

我們還可以這樣用

如:

var obj = {};obj.name = "張三";obj.age = 23;alert(obj.age);

如:

var obj = { "name": "張三",//給屬性加上雙引號 age: 23};alert(obj.name);

是不是感覺很強大很靈活呢?我在訪問屬性的時候一般都是點出來,但是還有另外的方式。

如:(我們可以使用中括號的形式來訪問屬性值)

var obj = { "name tow": "張三", age: 23};//alert(obj.name tow);//這里會報錯,屬性不能有空格alert(obj["name tow"]);//這里可以正常彈出

例:

Array類型

除了object之外,應該屬數組用的最多了。下面來羅列下常見用法。

同樣Array也有兩種創建方式:

var arr = new Array(1, 2, 3, 4, 5);//通過構造函數創建var arr2 = [5, 4, 3, 2, 1];//通過字面量表達式來創建 

上面兩種方式是等效的,我們可以直接通過下標的方式來訪問數組: alert(arr[2]); 。

如果我們想要打印數組中所有的值,直接打印數組的變量名就可以:

var arr2 = [5, 4, 3, 2, 1];//通過字面量表達式來創建var str2 = "";for (var i = 0; i < arr2.length; i++) { str2 += arr2[i] + ","}alert(str2);//打印拼接的字符串  alert(arr2);//直接打印變量名(實際上會自動調用數組的toString方法)

例:

 var arr2 = [5, 4, 3, 2, 1];//通過字面量表達式來創建var str2 = "";for (var i = 0; i < arr2.length; i++) { str2 += arr2[i] + ","}alert(str2);//打印拼接的字符串

例:

 var arr2 = [5, 4, 3, 2, 1];//通過字面量表達式來創建alert(arr2);//直接打印變量名(實際上會自動調用數組的toString方法)

上面直接打印arr2,我們發現默認都是以逗號分隔的。那么有時候,我們不想用逗號怎么辦呢。那你可能可以用到join方法

 var arr2 = [5, 4, 3, 2, 1];//通過字面量表達式來創建alert(arr2.join('_'));//直接打印變量名(實際上會自動調用數組的toString方法)

往數組添值:

我們可以直接: arr2[4] = 7; arr2[5] = 8; 

還有一種更加巧妙地添值方式: arr2[arr2.length] = 9; arr2[arr2.length] = 10; ,下標length剛好是數組最大長度的下一個,添加值后length再次動態自動累計。

棧方法、隊列方法:

什么是棧?(后進先出)。什么是隊列?(先進先出),我們怎樣用數組來模仿這種數據結構的訪問方式?下面通過一張圖來解釋下數組對象提供的四個方法。

JavaScript基礎篇(3)之Object、Function等引用類型

從圖可以看出:shift和push、unshift和pop的組合可以實現棧的數據結構訪問,shitf和pop、shift和unshift的組合可以實現隊列的數據機構訪問方式。 這里需要注意:pop和shift取數據的同時,數組中對于的值也同時移除了。

例:

 var arr2 = [5, 4, 3, 2, 1];alert("arr2.pop:" + arr2.pop() + " arr2:" + arr2);

 關于數組的排序:

關于數組的排序有sort(正)reverse(反)。

先看個例子,大家猜想下結果:

var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort());

 然結果并不是我們想要的:

 var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort());

 為什么會這樣呢?因為sort不會直接比較數字類型,而已轉為string了再做的比較。那么我們想要比較數字怎辦?我們可以往sort傳函數,例:

 function mycompare(o1, o2){ return o1 - o2;//如果為正數則o1大,負數則o2大,零則相等。}var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort(mycompare));

 有人會問o1和o2是怎么來的?這是sort函數規定的。這樣說大家可能不好接受。下面,我們自己來模擬下sort的排序,大家就明白了。

var arr2 = [5, 14, 23, 12, 1, 123, 23, 4, 5, 6, 32, 5, 3, 2, 1];arr2.mysort = function (fun) { //*********************具體排序過程******************* for (var i = 0; i < arr2.length - 1; i++) {  for (var j = 0; j < arr2.length - i; j++) {   if (fun(arr2[j], arr2[j + 1]) > 0) {//這里用我們傳進來的方法判斷是否要排序調換位置    var temp = arr2[j];    arr2[j] = arr2[j + 1];    arr2[j + 1] = temp;   }  } } //*************************************************** return arr2;} function mycompare(o1, o2) { return o1 - o2;//回調函數(具體的比較規則)}alert(arr2.mysort(mycompare)); var arr2 = [5, 14, 23, 12, 1, 123, 23, 4, 5, 6, 32, 5, 3, 2, 1];arr2.mysort = function (fun) { //*********************具體排序過程******************* for (var i = 0; i < arr2.length - 1; i++) {  for (var j = 0; j < arr2.length - i; j++) {  if (fun(arr2[j], arr2[j + 1]) > 0) {//這里用我們傳進來的方法判斷是否要排序調換位置   var temp = arr2[j];   arr2[j] = arr2[j + 1];   arr2[j + 1] = temp;   }  } } //*************************************************** return arr2;}function mycompare(o1, o2) { return o1 - o2;//回調函數(具體的比較規則)}alert(arr2.mysort(mycompare));

當然,我們模擬的并不是那么的好,大概就是這么個意思。

反序就簡單了:(直接reverse()就可以了)

function mysort(o1, o2){ return o1 - o2;//如果為正數則o1大,負數則o2大,零則相等。}var arr2 = [5, 14, 23, 12, 1];arr2.sort(mysort);arr2.reverse();alert(arr2);

數組的一些操作方法:
concat創建一個新的副本,并合并傳進來的參數

var colors = ["red", "green", "blue"];var colors2 = colors.concat("yellow", ["black", "brown"]);alert(colors); //red,green,bluealert(colors2); //red,green,blue,yellow,black,brow

slice創建一個新的副本,取數組的位置數據

var colors = ["red", "green", "blue", "yellow", "purple"];var colors2 = colors.slice(1);//從下標為1的開始,到末尾var colors3 = colors.slice(1, 4);//從下標1(包含1)到4(不包含4)alert(colors2); //green,blue,yellow,purplealert(colors3); //green,blue,yellow

splice會改變原數組數據,可實現對數組的刪、插和替換

 var colors = ["red", "green", "blue"]; var removed = colors.splice(0, 1); // 刪除第一項(從下標0開始,刪除1項) alert(colors); // green,blue alert(removed); // red,返回的數組中只包含一項 removed = colors.splice(1, 0, "yellow", "orange"); // 從位置 1 開始插入兩項(從下標0開始,刪除0項,并插入后面的參數數據) alert(colors); // green,yellow,orange,blue alert(removed); // 返回的是一個空數組 removed = colors.splice(1, 1, "red", "purple"); // 插入兩項,刪除一項(從下標1開始,刪除1項[也就是yellow],并插入后面的參數數據) alert(colors); // green,red,purple,orange,blue alert(removed); // yellow,返回的數組中只包含一項

查找位置方法

indexOf()和 lastIndexOf(),就是查找在數組中的位置,和string中的對應方法差不多。

迭代方法

? every():對數組中的每一項運行給定函數,如果該函數對每一項都返回 true,則返回 true。
? filter():對數組中的每一項運行給定函數,返回該函數會返回 true 的項組成的數組。
? forEach():對數組中的每一項運行給定函數。這個方法沒有返回值。
? map():對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組。
? some():對數組中的每一項運行給定函數,如果該函數對任一項返回 true,則返回 true。

以上方法都不會修改數組中的包含的值。

如:

var numbers = [1,2,3,4,5,4,3,2,1];var everyResult = numbers.every(function(item, index, array){return (item > 2);});alert(everyResult); //false

其中。forEach和map區別不大,只是一個有返回值,一個沒有。實際中我們用forEach比較多,下面我們模擬forEach的實現。

var str = "", str2 = "";var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];numbers.forEach(function (item, index, array) { str += item + "_";});//**************其實我們完全可以自己模擬實現*******numbers.myforEach = function (fun) { for (var i = 0; i < numbers.length; i++) {  fun(numbers[i], i, numbers); }}numbers.myforEach(function (item, index, array) { str2 += item + "*";})//***************************************************alert("str:" + str + " str2:" + str2);var str = "", str2 = "";var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];numbers.forEach(function (item, index, array) { str += item + "_";});//**************其實我們完全可以自己模擬實現*******numbers.myforEach = function (fun) { for (var i = 0; i < numbers.length; i++) {  fun(numbers[i], i, numbers); }}numbers.myforEach(function (item, index, array) { str2 += item + "*";})//***************************************************alert("str:" + str + " str2:" + str2);

歸并方法

 reduce()和 reduceRight(),這兩個方法是比較有意思的,以前還真沒接觸過。先看例子,再解釋:

var values = [1,2,3,4,5];var sum = values.reduce(function(prev, cur, index, array){ return prev + cur;});alert(sum); //15

也是個循環,第一次執行 prev 是 1, cur 是 2。第二次, prev 是 3(1 加 2 的結果), cur 是 3(數組的第三項)。這個過程會持續到把數組中的每一項都訪問一遍,最后返回結果。reduceRight只是方向相反。

下面我們來模擬:

var numbers = [1, 2, 3, 4, 5, 3];var sum = numbers.reduce(function (prev, cur, index, array) { return prev + cur;});//***********************模擬實現reduce**************************numbers.myreduce = function (fun) { for (var i = 0; i < numbers.length; i++) {  var temp = 0;  for (var j = 0; j < i; j++)   temp += numbers[j];  var tempNum = fun(temp, numbers[i], i, numbers); } return tempNum;}//*************************************************var sum2 = numbers.myreduce(function (prev, cur, index, array) { return prev + cur;})alert("sum:" + sum + " sum2:" + sum2); //var numbers = [1, 2, 3, 4, 5, 3];var sum = numbers.reduce(function (prev, cur, index, array) { return prev + cur;});//***********************模擬實現reduce**************************numbers.myreduce = function (fun) {for (var i = 0; i < numbers.length; i++) { var temp = 0; for (var j = 0; j < i; j++)  temp += numbers[j];   var tempNum = fun(temp, numbers[i], i, numbers);  }  return tempNum;}//*************************************************var sum2 = numbers.myreduce(function (prev, cur, index, array) { return prev + cur;})alert("sum:" + sum + " sum2:" + sum2); //

Date類型

我們很多時候需要測試一個函數的性能,可以取它的執行進過時間:

//取得開始時間var start = Date.now();//調用函數doSomething();//取得停止時間var stop = Date.now(),result = stop – start;

下面列出一些常用方法

getTime() 返回表示日期的毫秒數;與valueOf()方法返回的值相同
setTime(毫秒) 以毫秒數設置日期,會改變整個日期
getFullYear() 取得4位數的年份(如2007而非僅07)
getUTCFullYear() 返回UTC日期的4位數年份
setFullYear(年) 設置日期的年份。傳入的年份值必須是4位數字(如2007而非僅07)
setUTCFullYear(年) 設置UTC日期的年份。傳入的年份值必須是4位數字(如2007而非僅07)
getMonth() 返回日期中的月份,其中0表示一月, 11表示十二月
getUTCMonth() 返回UTC日期中的月份,其中0表示一月, 11表示十二月
setMonth(月) 設置日期的月份。傳入的月份值必須大于0,超過11則增加年份
setUTCMonth(月) 設置UTC日期的月份。傳入的月份值必須大于0,超過11則增加年份
getDate() 返回日期月份中的天數(1到31)
getUTCDate() 返回UTC日期月份中的天數(1到31)
setDate(日) 設置日期月份中的天數。如果傳入的值超過了該月中應有的天數,則增加月份
setUTCDate(日) 設置UTC日期月份中的天數。如果傳入的值超過了該月中應有的天數,則增加月份
getDay() 返回日期中星期的星期幾(其中0表示星期日, 6表示星期六)
getUTCDay() 返回UTC日期中星期的星期幾(其中0表示星期日, 6表示星期六)
getHours() 返回日期中的小時數(0到23)
getUTCHours() 返回UTC日期中的小時數(0到23)
setHours(時) 設置日期中的小時數。傳入的值超過了23則增加月份中的天數
setUTCHours(時) 設置UTC日期中的小時數。傳入的值超過了23則增加月份中的天數
getMinutes() 返回日期中的分鐘數(0到59)
getUTCMinutes() 返回UTC日期中的分鐘數(0到59)
setMinutes(分) 設置日期中的分鐘數。傳入的值超過59則增加小時數
setUTCMinutes(分) 設置UTC日期中的分鐘數。傳入的值超過59則增加小時數
getSeconds() 返回日期中的秒數(0到59)
getUTCSeconds() 返回UTC日期中的秒數(0到59)
setSeconds(秒) 設置日期中的秒數。傳入的值超過了59會增加分鐘數
setUTCSeconds(秒) 設置UTC日期中的秒數。傳入的值超過了59會增加分鐘數
getMilliseconds() 返回日期中的毫秒數
getUTCMilliseconds() 返回UTC日期中的毫秒數
setMilliseconds(毫秒) 設置日期中的毫秒數
setUTCMilliseconds(毫秒) 設置UTC日期中的毫秒數
getTimezoneOffset() 返回本地時間與UTC時間相差的分鐘數。例如,美國東部標準時間返回300。在某地進入夏令時的情況下,這個值會有所變化

RegExp類型

兩種表示法:

var pattern1 = /at/g; var re = new RegExp("cat", "g"); 

后面的參數代表模式,如:g:表示全局(global)模式、i:表示不區分大小寫(case-insensitive)模式、m:表示多行(multiline)模式

關于正則了解不是很清楚,后期有機會在單獨學習整理正則這塊。

Function類型

三種表示法:

function sum (num, num) { return num + num; } var sum = function(num, num){ return num + num; }; var sum = new Function("num", "num", "return num + num"); 

以上三種都是可行的,不過我們平時用得比較多的是第一種,第二種也有用,第三種用得比較少,但是最能看出function的本質,其實就是一個Function對象的實例。

我們來看看1和2的區別。

alert(sum1(1, 2));//彈出值 3alert(sum2(1, 2));//報異常[sum2 is not a function]function sum1(num1, num2) { return num1 + num2; }var sum2 = function (num1, num2) { return num1 + num2; };

因為js解析器是從上到下的解析,在執行sum2的時候還沒有定義,所以報異常。但是sum1比較特殊,是申明式的。在執行sum1之前就會”預解析“(函數聲明提升)。相當于把sun1的定義提到了最上面(放到源代碼樹的頂部)。

方法重載

嚴格來說,js中是沒有方法重載的,不過我們可以根據參數的個數來模擬。(還有,js中函數的形參我們是不確定類型的)

例:
上面并沒有出現我們預料中的結果,因為第二次定義的sun1不是實現的重載,而是直接覆蓋了第一次的定義。下面,我們就簡單的模擬實現方法重載:

function sum1(num1, num2, num3) { if (num1 != undefined && num2 != undefined && num3 != undefined) {  return num1 + num2 + num3; } else if (num1 != undefined && num2 != undefined)  return num1 + num2;}alert(sum1(1, 2));alert(sum1(1, 2, 3));

 函數內部屬性(arguments 和 this)

arguments:類數組對象,包含著傳入函數中的所有參數。下面通過arguments實現上面的模擬重載:

function sum(num, num, num) { var temp = ; if (arguments.length == ) {  //***********具體實現其邏輯*********************  for (var i = ; i < arguments.length; i++) {   temp += arguments[i];  } } else {  //***********具體實現其邏輯*********************  for (var i = ; i < arguments.length; i++) {   temp += arguments[i];  } } return temp;}alert("+=" + sum(, ) + " ++=" + sum(, , )); function sum1(num1, num2, num3) {var temp = 0;if (arguments.length == 3) {//***********具體實現其邏輯*********************for (var i = 0; i < arguments.length; i++) {temp += arguments[i];}}else {//***********具體實現其邏輯*********************for (var i = 0; i < arguments.length; i++) {temp += arguments[i];}}return temp;}alert("1+2=" + sum1(1, 2) + " 1+2+3=" + sum1(1, 2, 3));

我們在第一篇博文里面有提一個問題:

六、

 var fun = function (num1) {  if (num1 <= 1) {   return 1;  }  else {   return num1 * fun(num1 - 1);  } } var fun2 = fun; fun = function () {  return 1; } alert(fun2(5));//這里彈出什么? 

 不過,并沒有同學去解答,有人可能覺得太簡單,或是不樂意懶得去解答。這題的答案是:

 為什么會是這個答案呢?好像和我們預料中的不一樣。下面我們圖解:

JavaScript基礎篇(3)之Object、Function等引用類型

我們可能發現了一個問題,那就是第4步調用的已經不是所在的這個函數本身了(也就是沒有遞歸了),這不是我們想要的。我們要的是,不管外面怎么改變,4處都代表所在的函數指針。那么我們可以用到arguments的callee方法,例:

 函數的另一個內部屬性this:

 首先我們看看這樣一個問題:

var color = "red";var o = { color: "blue" };function sayColor() { alert(this.color);}sayColor(); //"red"o.sayColor = sayColor;o.sayColor(); //"blue"

為什么會有不同的結果?我們記住一句話,一般情況"哪個對象點出來的方法,this就是哪個對象"。上面的例子其實等效于:

window.color = "red";var o = { color: "blue" };function sayColor() { alert(this.color);}window.sayColor(); //"red"o.sayColor = sayColor;o.sayColor(); //"blue" 

 雖然"哪個對象點出來的方法,this就是哪個對象",但是有時候我們不想要這樣的結果,我們不想用對象點或者對象點出了想this是另外的對象。那么我們可以使用call:

 傳如的第一個參數,直接賦值給函數里面的this。和call類似的有apply,區別看下面:

 var o = { color: "blue" }; var o2 = { color: "red" }; function sayColor(a, b) {  alert(this.color + a + b); } sayColor.apply(o, [1, 2]);//只傳兩個參數,第一個是為this賦值的對象,第二個是函數實參數組 sayColor.call(o2, 1, 2);//可以傳多個參數,第一個是為this賦值的對象,后面的是函數實參用逗號分割

基本包裝類型

 在這個系列的第一篇中有個問題:

四、

var obj1 = {}; obj1.name2 = "張三";var str1 = "test"; str1.name2 = "李四";alert(obj1.name2 + " " + str1.name2);

 為什么會是這樣的結果?因為str1.name2設置值的時候訪問的是string的包裝類,然后再次訪問str1.name2之前就把之前那個包裝類已經被銷毀。

為什么要有包裝類?

因為可以像操作引用對象一樣操作基本數據類型,如: var s1 = "some text"; var s2 = s1.substring(2);

哪些基本類型有包裝類?

Boolean、Number和String類型。

瀏覽器的內置對象

Global(其實也就是我們平時用的window)和Math(一些計算功能)

URI 編碼方法

encodeURI、encodeURIComponent、decodeURI、decodeURIComponent//encodeURI主要對完整的url進行編碼(空格會編碼成%20)【對應該的解碼decodeURI】alert(window.encodeURI("http://i.cnblogs.com/EditPosts.aspx?postid = 5002381"));//encodeURIComponent會把url中的所有特殊字符進行轉碼(所以,我們一般用來進行部分url轉碼,如Url中的參數)【對應的解碼decodeURIComponent】alert(window.encodeURIComponent("http://i.cnblogs.com/EditPosts.aspx?postid = 5002381"));eval

這是一個js中最最最強大的函數了,相對與一個獨立的解析器。如我文中的操作實例就是用這個函數實現的。

如:

 <textarea class="test_code" style="width: %;height:px; max-height: px;">//。。。。這里面寫js代碼var obj = {}; obj.name = "張三";var str = "test"; str.name = "李四";alert(obj.name + " " + str.name); </textarea> <input type="button" class="test_code_but" onclick="eval($(this).prev().val());" value="運行" />

效果圖:

JavaScript基礎篇(3)之Object、Function等引用類型

當然,你還的引入jqeruy問題,博客園中默認就已經引入了。所以,你不需要再次引入,你測試的話是看不到alert彈框的,因為博客園禁掉了。我的是用的jquery ui中的Dialog對話框做的。



注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
92看片淫黄大片欧美看国产片| 欧美精品videossex性护士| 91久久国产综合久久91精品网站| 亚洲无线码在线一区观看| 久久久亚洲影院你懂的| 中文字幕欧美日韩va免费视频| 日韩精品在线免费观看视频| 精品在线小视频| 日韩av三级在线观看| 久久精品夜夜夜夜夜久久| 欧美乱妇高清无乱码| 91探花福利精品国产自产在线| 成人a免费视频| 午夜免费久久久久| 亚洲欧美日韩综合| 久久久精品久久久| 97久久超碰福利国产精品…| 欧美性xxxx在线播放| 久久深夜福利免费观看| 中文字幕av一区| 欧美激情在线播放| 亚洲精品免费网站| 欧美激情一二三| 韩国三级日本三级少妇99| 国产精品极品美女粉嫩高清在线| 91网站在线看| 国产精品久久久久影院日本| 成人激情免费在线| 久久精品国产v日韩v亚洲| 亚洲精品日韩激情在线电影| 色综合久久中文字幕综合网小说| 久久激情视频免费观看| 亚洲女同性videos| 欧美网站在线观看| 日韩高清电影好看的电视剧电影| 欧美成人精品一区二区| 成人国内精品久久久久一区| 青草青草久热精品视频在线网站| 亚洲精品成人av| 91欧美精品午夜性色福利在线| 蜜臀久久99精品久久久久久宅男| 亚洲人高潮女人毛茸茸| 亚洲国产精品电影| 91麻豆国产语对白在线观看| 欧美日韩国产一区中文午夜| 欧美性高跟鞋xxxxhd| www.亚洲成人| 欧美精品性视频| 欧美视频一二三| 国产精品免费视频久久久| 日韩成人黄色av| 欧美一区二三区| 不卡av日日日| 国产精品天天狠天天看| 精品久久中文字幕久久av| 欧美理论在线观看| 精品久久久视频| 亚洲欧美激情视频| 日韩精品中文字| 欧美激情在线一区| 在线观看日韩欧美| 日韩中文字幕国产精品| 国产精品久久久久免费a∨大胸| 亚洲国产天堂久久综合| 国产一区二区三区在线观看视频| 欧美黑人极品猛少妇色xxxxx| 国产精品福利观看| 91久久久久久久一区二区| 一区二区欧美日韩视频| 成人黄色免费网站在线观看| 欧美巨乳美女视频| 神马久久桃色视频| 成人a在线观看| 国产视频久久久久| 国模精品视频一区二区三区| 欧美—级高清免费播放| 2019亚洲男人天堂| 亚洲日韩欧美视频一区| 最好看的2019的中文字幕视频| 日韩美女福利视频| 国产精品久久久久久中文字| 国产日韩欧美日韩大片| 中文字幕亚洲字幕| 米奇精品一区二区三区在线观看| 久久成人人人人精品欧| 爱福利视频一区| 欧美电影免费观看大全| 亚洲视频一区二区| 亚洲精品一区久久久久久| 日韩国产在线播放| 国产999精品久久久影片官网| 国产一区二区三区视频| 成人黄色av网站| 在线观看日韩欧美| 欧美超级乱淫片喷水| 日韩精品视频在线观看网址| 欧美日韩中文字幕综合视频| 欧美午夜精品伦理| 午夜精品视频网站| 久久久久久69| 久久久久久久影视| 日韩在线视频免费观看高清中文| 亚洲人成亚洲人成在线观看| 精品无人区乱码1区2区3区在线| 欧美大片va欧美在线播放| 91精品国产91久久久久久不卡| 国产精品黄色影片导航在线观看| 日韩视频―中文字幕| 久久亚洲一区二区三区四区五区高| 深夜精品寂寞黄网站在线观看| 成人妇女淫片aaaa视频| 欧美一级片在线播放| 欧美成人全部免费| 人妖精品videosex性欧美| 精品国产一区二区三区久久狼黑人| 一区二区三区无码高清视频| 欧美视频中文在线看| 国产亚洲精品91在线| 国产成人综合亚洲| 亚洲综合av影视| 成人激情综合网| 三级精品视频久久久久| 国产成人精品免费视频| 久久久女人电视剧免费播放下载| 久久亚洲一区二区三区四区五区高| 亚洲a一级视频| 亚洲精品99久久久久中文字幕| 中文字幕国产精品| 国产成人avxxxxx在线看| 日韩精品视频免费在线观看| 亚洲色在线视频| 亚洲色图av在线| 精品久久中文字幕久久av| 日韩免费看的电影电视剧大全| 美女扒开尿口让男人操亚洲视频网站| 日韩av一区二区在线观看| 最近2019中文字幕一页二页| 亚洲另类图片色| 国产精品第一视频| 亚洲高清福利视频| 中文字幕精品www乱入免费视频| 欧美日韩国产成人在线| 国产亚洲人成网站在线观看| 亚洲国产精久久久久久| 在线精品国产成人综合| 午夜精品久久久久久久男人的天堂| 91精品久久久久久久久青青| 午夜精品一区二区三区在线视频| 中文字幕亚洲情99在线| 亚洲视频日韩精品| 国模吧一区二区三区| 欧美色另类天堂2015| 久久久电影免费观看完整版| 欧美电影免费观看高清完整| 久久久久久97| 国产在线精品一区免费香蕉| 九九久久久久99精品| 亚洲精品国产福利| 成人激情视频免费在线| 精品综合久久久久久97| 亚洲欧美另类自拍| 亚洲一区中文字幕在线观看| 欧美激情aaaa| 国产精品久久精品|