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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

javascript高级程序设计 学习笔记 第五章 上

發(fā)布時(shí)間:2023/12/9 javascript 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript高级程序设计 学习笔记 第五章 上 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? 第五章 ? 引用類型的值(對(duì)象)是引用類型的一個(gè)實(shí)例。在 ECMAScript 中,引用類型是一種數(shù)據(jù)結(jié)構(gòu), 用于將數(shù)據(jù)和功能組織在一起。它也常被稱為類,但這種稱呼并不妥當(dāng)。盡管 ECMAScript 從技術(shù)上講是一門面向?qū)ο蟮恼Z(yǔ)言,但它不具備傳統(tǒng)的面向?qū)ο笳Z(yǔ)言所支持的類和接口等基本結(jié)構(gòu)。引用類型有時(shí)候也被稱為對(duì)象定義,因?yàn)樗鼈兠枋龅氖且活悓?duì)象所具有的屬性和方法。 ? 對(duì)象是某個(gè)特定引用類型的實(shí)例。新對(duì)象是使用 new 操作符后跟一個(gè)構(gòu)造函數(shù)來(lái)創(chuàng)建的。 構(gòu)造函數(shù)本身就是一個(gè)函數(shù),只不過(guò)該函數(shù)是出于創(chuàng)建新對(duì)象的目的而定義的。 ? ECMAScript 提供了很多原生引用類 型(例如 Object),以便開發(fā)人員用以實(shí)現(xiàn)常見的計(jì)算任務(wù)。 ? 5.1 Object類型 到目前為止,我們看到的大多數(shù)引用類型值都是 Object 類型的實(shí)例;而且,Object 也是 ECMAScript 中使用最多的一個(gè)類型。 創(chuàng)建 Object 實(shí)例的方式有兩種。第一種是使用 new 操作符后跟 Object 構(gòu)造函數(shù)。 eg: var person = new Object(); person.name = "Nicholas"; person.age = 29; 另一種方式是使用對(duì)象字面量表示法。對(duì)象字面量是對(duì)象定義的一種簡(jiǎn)寫形式,目的在于簡(jiǎn)化創(chuàng)建 包含大量屬性的對(duì)象的過(guò)程。 eg: var person = { name : "Nicholas", age : 29 }; 在最后一個(gè)屬性后面添加逗號(hào),會(huì)在 IE7 及更早版本和Opera 中導(dǎo)致錯(cuò)誤。 ? 在這個(gè)例子中,左邊的花括號(hào)({)表示對(duì)象字面量的開始,因?yàn)樗霈F(xiàn)在了表達(dá)式上下文 (expression context)中。ECMAScript 中的表達(dá)式上下文指的是能夠返回一個(gè)值(表達(dá)式)。賦值操作 符表示后面是一個(gè)值,所以左花括號(hào)在這里表示一個(gè)表達(dá)式的開始。同樣的花括號(hào),如果出現(xiàn)在一個(gè)語(yǔ)句上下文(statement context)中,例如跟在 if 語(yǔ)句條件的后面,則表示一個(gè)語(yǔ)句塊的開始。 ? 在使用對(duì)象字面量語(yǔ)法時(shí),屬性名也可以使用字符串。 eg: var person = {"name" : "Nicholas", "age" : 29, 5 : true }; 這個(gè)例子會(huì)創(chuàng)建一個(gè)對(duì)象,包含三個(gè)屬性:name、age 和 5。但這里的數(shù)值屬性名會(huì)自動(dòng)轉(zhuǎn)換為字符串。 ? 對(duì)象字面量也是向函數(shù)傳遞大量可選參 數(shù)的首選方式。 eg: ? 這種傳遞參數(shù)的模式最適合需要向函數(shù)傳入大量可選參數(shù)的情形。一般來(lái)講,命名參數(shù)雖然容易處理,但在有多個(gè)可選參數(shù)的情況下就會(huì)顯示不夠靈活。最好的做法 是對(duì)那些必需值使用命名參數(shù),而使用對(duì)象字面量來(lái)封裝多個(gè)可選參數(shù)。 ? 一般來(lái)說(shuō),訪問(wèn)對(duì)象屬性時(shí)使用的都是點(diǎn)表示法,這也是很多面向?qū)ο笳Z(yǔ)言中通用的語(yǔ)法。不過(guò), 在 JavaScript 也可以使用方括號(hào)表示法來(lái)訪問(wèn)對(duì)象的屬性。在使用方括號(hào)語(yǔ)法時(shí),應(yīng)該將要訪問(wèn)的屬性 以字符串的形式放在方括號(hào)中。 eg: alert(person["name"]); //"Nicholas" alert(person.name); //"Nicholas" 從功能上看,這兩種訪問(wèn)對(duì)象屬性的方法沒(méi)有任何區(qū)別。但方括號(hào)語(yǔ)法的主要優(yōu)點(diǎn)是可以通過(guò)變量 來(lái)訪問(wèn)屬性。 eg: var propertyName = "name"; alert(person[propertyName]); //"Nicholas" 如果屬性名中包含會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤的字符,或者屬性名使用的是關(guān)鍵字或保留字,也可以使用方括 號(hào)表示法。 eg: person["first name"] = "Nicholas"; 由于"first name"中包含一個(gè)空格,所以不能使用點(diǎn)表示法來(lái)訪問(wèn)它。然而,屬性名中是可以包 含非字母非數(shù)字的,這時(shí)候就可以使用方括號(hào)表示法來(lái)訪問(wèn)它們。 ? 通常,除非必須使用變量來(lái)訪問(wèn)屬性,否則我們建議使用點(diǎn)表示法。 ? 5.2 Array類型 數(shù)據(jù)的有序列表,但與其他語(yǔ)言不同的是,ECMAScript 數(shù)組的每一項(xiàng)可以保存任何類型的數(shù)據(jù)。而且,ECMAScript 數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的,即可以隨著數(shù)據(jù)的添加自動(dòng)增長(zhǎng)以容 納新增數(shù)據(jù)。 ? 創(chuàng)建數(shù)組的基本方式有兩種。第一種是使用 Array構(gòu)造函數(shù)。 eg: var colors = new Array(); 如果預(yù)先知道數(shù)組要保存的項(xiàng)目數(shù)量,也可以給構(gòu)造函數(shù)傳遞該數(shù)量,而該數(shù)量會(huì)自動(dòng)變成 length 屬性的值。 eg: var colors = new Array(20); 也可以向 Array 構(gòu)造函數(shù)傳遞數(shù)組中應(yīng)該包含的項(xiàng)。以下代碼創(chuàng)建了一個(gè)包含 3 個(gè)字符串值的數(shù)組: var colors = new Array("red", "blue", "green"); 給構(gòu)造函數(shù)傳遞值:如果傳遞的是數(shù) 值,則會(huì)按照該數(shù)值創(chuàng)建包含給定項(xiàng)數(shù)的數(shù)組;而如果傳遞的是其他類型的參數(shù),則會(huì)創(chuàng)建包含那個(gè)值 的只有一項(xiàng)的數(shù)組。 ? 另外,在使用 Array 構(gòu)造函數(shù)時(shí)也可以省略 new 操作符。如下面的例子所示,省略 new 操作符的 結(jié)果相同: var colors = Array(3); // 創(chuàng)建一個(gè)包含 3 項(xiàng)的數(shù)組 var names = Array("Greg"); // 創(chuàng)建一個(gè)包含 1 項(xiàng),即字符串"Greg"的數(shù)組 創(chuàng)建數(shù)組的第二種基本方式是使用數(shù)組字面量表示法。數(shù)組字面量由一對(duì)包含數(shù)組項(xiàng)的方括號(hào)表 示,多個(gè)數(shù)組項(xiàng)之間以逗號(hào)隔開。 var colors = ["red", "blue", "green"]; // 創(chuàng)建一個(gè)包含 3 個(gè)字符串的數(shù)組 var names = []; // 創(chuàng)建一個(gè)空數(shù)組 var values = [1,2,]; // 不要這樣!這樣會(huì)創(chuàng)建一個(gè)包含 2 或 3 項(xiàng)的數(shù)組 var options = [,,,,,]; // 不要這樣!這樣會(huì)創(chuàng)建一個(gè)包含 5 或 6 項(xiàng)的數(shù)組 分析: 在 IE 中,values 會(huì)成為一個(gè)包含 3 個(gè)項(xiàng)且每 項(xiàng)的值分別為 1、2 和 undefined 的數(shù)組;在其他瀏覽器中,values 會(huì)成為一個(gè)包含 2 項(xiàng)且值分別為 1 和 2 的數(shù)組。原因是 IE8 及之前版本中的 ECMAScript 實(shí)現(xiàn)在數(shù)組字面量方面存在 bug。由于這個(gè) bug導(dǎo)致的另一種情況如最后一行代碼所示,該行代碼可能會(huì)創(chuàng)建包含 5 項(xiàng)的數(shù)組(在 IE9+、Firefox、Opera、Safari 和 Chrome 中),也可能會(huì)創(chuàng)建包含 6 項(xiàng)的數(shù)組(在 IE8 及更早版本中)。在像這種省略值的情況下, 每一項(xiàng)都將獲得undefined值;這個(gè)結(jié)果與調(diào)用Array構(gòu)造函數(shù)時(shí)傳遞項(xiàng)數(shù)在邏輯上是相同的。但是 由于 IE 的實(shí)現(xiàn)與其他瀏覽器不一致,因此我們強(qiáng)烈建議不要使用這種語(yǔ)法。 ? 在讀取和設(shè)置數(shù)組的值時(shí),要使用方括號(hào)并提供相應(yīng)值的基于 0 的數(shù)字索引,如下所示: var colors = ["red", "blue", "green"]; // 定義一個(gè)字符串?dāng)?shù)組 alert(colors[0]); // 顯示第一項(xiàng) colors[2] = "black"; // 修改第三項(xiàng) colors[3] = "brown"; // 新增第四項(xiàng) 如果設(shè) 置某個(gè)值的索引超過(guò)了數(shù)組現(xiàn)有項(xiàng)數(shù),如這個(gè)例子中的 colors[3]所示,數(shù)組就會(huì)自動(dòng)增加到該索引 值加 1 的長(zhǎng)度(就這個(gè)例子而言,索引是 3,因此數(shù)組長(zhǎng)度就是 4)。 ? 數(shù)組的 length 屬性很有特點(diǎn)——它不是只讀的。因此,通過(guò)設(shè)置這個(gè)屬性,可以從數(shù)組的末尾移 除項(xiàng)或向數(shù)組中添加新項(xiàng)。請(qǐng)看下面的例子: var colors = ["red", "blue", "green"]; // 創(chuàng)建一個(gè)包含 3 個(gè)字符串的數(shù)組 colors.length = 2; alert(colors[2]); //undefined 如果將其 length屬性設(shè)置為大于數(shù)組 項(xiàng)數(shù)的值,則新增的每一項(xiàng)都會(huì)取得 undefined 值,如下所示: var colors = ["red", "blue", "green"]; // 創(chuàng)建一個(gè)包含 3 個(gè)字符串的數(shù)組 colors.length = 4; alert(colors[3]); //undefined 利用 length 屬性也可以方便地在數(shù)組末尾添加新項(xiàng),如下所示: var colors = ["red", "blue", "green"]; // 創(chuàng)建一個(gè)包含 3 個(gè)字符串的數(shù)組 colors[colors.length] = "black"; //(在位置3)添加一種顏色 colors[colors.length] = "brown"; //(在位置4)再添加一種顏色 數(shù)組最多可以包含 4 294 967 295 個(gè)項(xiàng). 5.2.1 檢測(cè)數(shù)組 對(duì)于一個(gè)網(wǎng)頁(yè),或者一個(gè)全局作用域而言,使用 instanceof 操作符就能得到滿意的結(jié)果: if (value instanceof Array){ //對(duì)數(shù)組執(zhí)行某些操作 } instanceof 操作符的問(wèn)題在于,它假定只有一個(gè)全局執(zhí)行環(huán)境。如果網(wǎng)頁(yè)中包含多個(gè)框架,那實(shí) 際上就存在兩個(gè)以上不同的全局執(zhí)行環(huán)境,從而存在兩個(gè)以上不同版本的 Array構(gòu)造函數(shù)。如果你從 一個(gè)框架向另一個(gè)框架傳入一個(gè)數(shù)組,那么傳入的數(shù)組與在第二個(gè)框架中原生創(chuàng)建的數(shù)組分別具有各自 不同的構(gòu)造函數(shù)。 ? 為了解決這個(gè)問(wèn)題,ECMAScript 5 新增了 Array.isArray()方法。這個(gè)方法的目的是最終確定某 個(gè)值到底是不是數(shù)組,而不管它是在哪個(gè)全局執(zhí)行環(huán)境中創(chuàng)建的。這個(gè)方法的用法如下。 if (Array.isArray(value)){ //對(duì)數(shù)組執(zhí)行某些操作 } 支持 Array.isArray()方法的瀏覽器有 IE9+、Firefox 4+、Safari 5+、Opera 10.5+和 Chrome。 5.2.2 轉(zhuǎn)換方法 所有對(duì)象都具有 toLocaleString()、toString()和 valueOf()方法。其中,調(diào)用 數(shù)組的 toString()方法會(huì)返回由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串。而 調(diào)用 valueOf()返回的還是數(shù)組。實(shí)際上,為了創(chuàng)建這個(gè)字符串會(huì)調(diào)用數(shù)組每一項(xiàng)的 toString()方 法。 ? 當(dāng)調(diào)用數(shù)組的 toLocaleString()方法時(shí),它也會(huì)創(chuàng)建一個(gè)數(shù)組值的以逗號(hào)分隔的字符 串。而與前兩個(gè)方法唯一的不同之處在于,這一次為了取得每一項(xiàng)的值,調(diào)用的是每一項(xiàng)的 toLocale- String()方法,而不是 toString()方法。 eg: var person1 = { toLocaleString : function () { return "Nikolaos"; }, toString : function() { return "Nicho"; } }; var person2 = { toLocaleString : function () { return "Grigorios"; }, toString : function() { return "Greg"; } }; var people = [person1, person2]; alert(people); //Nicho,Greg alert(people.toString()); //Nicho,Greg alert(people.toLocaleString()); //Nikolaos,Grigorios 數(shù)組繼承的 toLocaleString()、toString()和 valueOf()方法,在默認(rèn)情況下都會(huì)以逗號(hào)分隔的字 符串的形式返回?cái)?shù)組項(xiàng)。而如果使用 join()方法,則可以使用不同的分隔符來(lái)構(gòu)建這個(gè)字符串。join()方 法只接收一個(gè)參數(shù),即用作分隔符的字符串,然后返回包含所有數(shù)組項(xiàng)的字符串。 eg: var colors = [1, "green", "blue"];colors.join("||"); // "1||green||blue" 我們使用 join()方法重現(xiàn)了 toString()方法的輸出。在傳遞逗號(hào)的情況下,得到了以 逗號(hào)分隔的數(shù)組值。 var colors = [1, "green", "blue"]; colors.toString(); //"1,green,blue" //colors.join(",") //"1,green,blue" 如果不給 join()方法傳入任何值,或者給它傳入 undefined,則使用逗號(hào)作為分隔 符。IE7 及更早版本會(huì)錯(cuò)誤的使用字符串"undefined"作為分隔符。 eg: var colors = [1, "blue","red"];//colors.join() //"1,blue,red" //colors.join("undefined") //"1undefinedblueundefinedred" colors.join(undefined) //"1,blue,red" //colors.join(null) //"1nullbluenullred" 如果數(shù)組中的某一項(xiàng)的值是 null 或者 undefined,那么該值在 join()、 toLocaleString()、toString()和 valueOf()方法返回的結(jié)果中以空字符串表示。 eg: var colors = [1, undefined, "blue",null];//colors.join(",") //"1,,blue," //colors.toString() //"1,,blue," colors.valueOf() //[1, undefined, "blue", null] //colors.toLocaleString() //"1,,blue," colors.valueOf()結(jié)果并未預(yù)想的以空字符串表示??? eg: var nobody = [1,,"red"]; var color = [1,2,"red"]; var nullArr = [1,null,"red"]; var undefinedArr = [1,undefined,"red"];//nobody.valueOf() //[1, undefined, "red"] //nobody.join(",") //"1,,red" //nobody.toString() //"1,,red" //nobody instanceof Array //true//color.valueOf() //[1, 2, "red"] //color.join(",") //"1,2,red" //color.toString() //"1,2,red" //color instanceof Array //true//nullArr.valueOf() //[1, null, "red"] //nullArr.join(",") //"1,,red" //nullArr.toString() //"1,,red" //nullArr instanceof Array //true//undefinedArr.valueOf() //[1, undefined, "red"] //undefinedArr.join(",") //"1,,red" undefinedArr.toString() //"1,,red" //undefinedArr instanceof Array //true 分析:當(dāng)數(shù)組某一項(xiàng)為空時(shí),valueOf結(jié)果為undefined,其他情況都返回原來(lái)值(null的valueOf結(jié)果為null,undefined的valueOf結(jié)果為undefined); 而當(dāng)數(shù)組某項(xiàng)為空或null或nudefined:join(",")和toString()的結(jié)果都為空。 5.2.3 棧方法 棧是一種 LIFO(Last-In-First-Out, 后進(jìn)先出)的數(shù)據(jù)結(jié)構(gòu),也就是最新添加的項(xiàng)最早被移除。而棧中項(xiàng)的插入(叫做推入)和移除(叫做 彈出),只發(fā)生在一個(gè)位置——棧的頂部。ECMAScript 為數(shù)組專門提供了 push()和 pop()方法,以便 實(shí)現(xiàn)類似棧的行為。 ? push()方法可以接收任意數(shù)量的參數(shù),把它們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長(zhǎng)度。而 pop()方法則從數(shù)組末尾移除最后一項(xiàng),減少數(shù)組的 length 值,然后返回移除的項(xiàng)。 eg: var colors = new Array(); var count = colors.push("red", "green");console.log(count); //2 count = colors.push("black");console.log(count); //3 console.log(colors); // ["red", "green", "black"]var item = colors.pop();console.log(item); //black console.log(colors.length); //2 console.log(colors); // ["red", "green"] 5.2.4 隊(duì)列方法 隊(duì)列數(shù)據(jù)結(jié)構(gòu)的訪問(wèn)規(guī)則是 FIFO(First-In-First-Out, 先進(jìn)先出)。隊(duì)列在列表的末端添加項(xiàng),從列表的前端移除項(xiàng)。shift(),它能夠移除數(shù)組中的第一個(gè)項(xiàng)并返回該項(xiàng),同時(shí)將數(shù)組長(zhǎng)度減 1。結(jié)合使用 shift()和 push()方法,可以像使 用隊(duì)列一樣使用數(shù)組。 eg: var colors = new Array(); var count = colors.push("red", "green");console.log(count); //2 count = colors.push("black");console.log(count); //3 console.log(colors); // ["red", "green", "black"]var item = colors.shift();console.log(item); //red console.log(colors.length); //2 console.log(colors); // ["green", "black"] unshift()與 shift()的用途相反: 它能在數(shù)組前端添加任意個(gè)項(xiàng)并返回新數(shù)組的長(zhǎng)度。因此,同時(shí)使用 unshift()和 pop()方法,可以從相反的方向來(lái)模擬隊(duì)列,即在數(shù)組的前端添加項(xiàng),從數(shù)組末端移除項(xiàng)。 eg: var colors = new Array(); var count = colors.unshift("red", "green");console.log(count); //2 count = colors.unshift("black");console.log(count); //3 console.log(colors); // ["black", "red", "green"]var item = colors.pop();console.log(item); //green console.log(colors.length); //2 console.log(colors); // ["black", "red"] ? ? 5.2.5 重排序方法 數(shù)組中已經(jīng)存在兩個(gè)可以直接用來(lái)重排序的方法:reverse()和 sort()。有讀者可能猜到了, reverse()方法會(huì)反轉(zhuǎn)數(shù)組項(xiàng)的順序。 eg: var values = [1, 2, 3, 4, 5];
values.reverse(); alert(values);
//5,4,3,2,1 在默認(rèn)情況下,sort()方法按升序排列數(shù)組項(xiàng)——即最小的值位于最前面,最大的值排在最后面。 為了實(shí)現(xiàn)排序,sort()方法會(huì)調(diào)用每個(gè)數(shù)組項(xiàng)的 toString()轉(zhuǎn)型方法,然后比較得到的字符串,以 確定如何排序。即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort()方法比較的也是字符串。 eg: var values = [0, 1, 5, 10, 15];
values.sort();
alert(values); //0,1,10,15,5 sort()方法也會(huì)根據(jù)測(cè)試字符串的結(jié)果改變?cè)瓉?lái)的順序。 因?yàn)閿?shù)值 5 雖然小于 10,但在進(jìn)行字符串比較時(shí),"10"則位于"5"的前面,于是數(shù)組的順序就被修改了。 sort()方法可以接收一個(gè)比較函數(shù)作為參 數(shù),以便我們指定哪個(gè)值位于哪個(gè)值的前面。 eg: function compare(){return -1;} var values = [0, 10,2,15];values.sort(compare);console.log(values); // [0, 10, 2, 15] 函數(shù)返回-1時(shí),順序不變。 eg2: function compare(){return 1;} var values = [0, 10,2,15];values.sort(compare);console.log(values); // [15, 2, 10, 0] 函數(shù)返回1時(shí),順序相反。 eg3: function compare(){return 0;} var values = [0, 10,2,15];values.sort(compare);console.log(values); // [0, 10, 2, 15] 函數(shù)返回0時(shí),順序不變。 eg4: function compare(value1, value2) {if (value1 < value2) {return -1;} else if (value1 > value2) {return 1;} else {return 0; }} var values = [0, 10,2,15];values.sort(compare);console.log(values); // [0, 2, 10, 15] 在將比較函數(shù)傳遞到 sort()方法之后,數(shù)值仍然保持了正確的升序。 eg5: function compare(value1, value2) {if (value1 < value2) {return 1;} else if (value1 > value2) {return -1;} else {return 0; }} var values = [0, 10,2,15];values.sort(compare);console.log(values); // [15, 10, 2, 0] 通過(guò)比較函數(shù)產(chǎn)生降序排序的結(jié)果,只要交換比較函數(shù)返回的值即可。 ? 對(duì)于數(shù)值類型或者其 valueOf()方法會(huì)返回?cái)?shù)值類型的對(duì)象類型,可以使用一個(gè)更簡(jiǎn)單的比較函數(shù)。這個(gè)函數(shù)只要用第二個(gè)值減第一個(gè)值即可 function compare(value1, value2){ return value2 - value1; } 由于比較函數(shù)通過(guò)返回一個(gè)小于零、等于零或大于零的值來(lái)影響排序結(jié)果,因此減法操作就可以適 當(dāng)?shù)靥幚硭羞@些情況。 ? 5.2.6 操作方法 concat()方法可以基于當(dāng)前數(shù) 組中的所有項(xiàng)創(chuàng)建一個(gè)新數(shù)組。具體來(lái)說(shuō),這個(gè)方法會(huì)先創(chuàng)建當(dāng)前數(shù)組一個(gè)副本,然后將接收到的參數(shù) 添加到這個(gè)副本的末尾,最后返回新構(gòu)建的數(shù)組。在沒(méi)有給 concat()方法傳遞參數(shù)的情況下,它只是 復(fù)制當(dāng)前數(shù)組并返回副本。如果傳遞給 concat()方法的是一或多個(gè)數(shù)組,則該方法會(huì)將這些數(shù)組中的 每一項(xiàng)都添加到結(jié)果數(shù)組中。如果傳遞的值不是數(shù)組,這些值就會(huì)被簡(jiǎn)單地添加到結(jié)果數(shù)組的末尾。 eg: var colors = ["red", "green", "blue"]; var colors2 = colors.concat("yellow", ["black", "brown"]); alert(colors); //red,green,blue alert(colors2); //red,green,blue,yellow,black,brown ? slice(),它能夠基于當(dāng)前數(shù)組中的一或多個(gè)項(xiàng)創(chuàng)建一個(gè)新數(shù)組。slice()方法可以 接受一或兩個(gè)參數(shù),即要返回項(xiàng)的起始和結(jié)束位置。在只有一個(gè)參數(shù)的情況下,slice()方法返回從該 參數(shù)指定位置開始到當(dāng)前數(shù)組末尾的所有項(xiàng)。如果有兩個(gè)參數(shù),該方法返回起始和結(jié)束位置之間的項(xiàng)— —但不包括結(jié)束位置的項(xiàng)。注意,slice()方法不會(huì)影響原始數(shù)組。 eg: var colors = ["red", "green", "blue", "yellow", "purple"]; var colors2 = colors.slice(1); var colors3 = colors.slice(1,4); alert(colors2); //green,blue,yellow,purple alert(colors3); //green,blue,yellow 如果 slice()方法的參數(shù)中有一個(gè)負(fù)數(shù),則用數(shù)組長(zhǎng)度加上該數(shù)來(lái)確定相應(yīng)的位 置。例如,在一個(gè)包含 5 項(xiàng)的數(shù)組上調(diào)用 slice(-2,-1)與調(diào)用 slice(3,4)得到的 結(jié)果相同。如果結(jié)束位置小于起始位置,則返回空數(shù)組。 ? splice()方法,這個(gè)方法恐怕要算是最強(qiáng)大的數(shù)組方法了,它有很多種用法。 splice()的主要用途是向數(shù)組的中部插入項(xiàng),但使用這種方法的方式則有如下 3 種。
  • 刪除:可以刪除任意數(shù)量的項(xiàng),只需指定 2 個(gè)參數(shù):要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。 例如,splice(0,2)會(huì)刪除數(shù)組中的前兩項(xiàng)。
  • 插入:可以向指定位置插入任意數(shù)量的項(xiàng),只需提供 3 個(gè)參數(shù):起始位置、0(要?jiǎng)h除的項(xiàng)數(shù)) 和要插入的項(xiàng)。如果要插入多個(gè)項(xiàng),可以再傳入第四、第五,以至任意多個(gè)項(xiàng)。例如, splice(2,0,"red","green")會(huì)從當(dāng)前數(shù)組的位置 2 開始插入字符串"red"和"green"。
  • 替換:可以向指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定 3 個(gè)參數(shù):起 始位置、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)。插入的項(xiàng)數(shù)不必與刪除的項(xiàng)數(shù)相等。例如, splice (2,1,"red","green")會(huì)刪除當(dāng)前數(shù)組位置 2 的項(xiàng),然后再?gòu)奈恢?2 開始插入字符串 "red"和"green"。
  • splice()方法始終都會(huì)返回一個(gè)數(shù)組,該數(shù)組中包含從原始數(shù)組中刪除的項(xiàng)(如果沒(méi)有刪除任何 項(xiàng),則返回一個(gè)空數(shù)組)。
eg:? var colors = ["red", "green", "blue"];//var removed = colors.splice(0,1); //console.log(colors); // ["green", "blue"] //console.log(removed); // ["red"],返回的數(shù)組中只包含一項(xiàng)var removed = colors.splice(1, 0, "yellow", "orange"); console.log(colors); // ["red", "yellow", "orange", "green", "blue"] console.log(removed); // [],返回的是一個(gè)空數(shù)組//var removed = colors.splice(1, 1, "red", "purple"); //console.log(colors); // ["red", "red", "purple", "blue"] //console.log(removed); // ["green"],返回的數(shù)組中只包含一項(xiàng) 5.2.7 位置方法 ECMAScript 5 為數(shù)組實(shí)例添加了兩個(gè)位置方法:indexOf()和 lastIndexOf()。這兩個(gè)方法都接收 兩個(gè)參數(shù):要查找的項(xiàng)和(可選的)表示查找起點(diǎn)位置的索引。其中,indexOf()方法從數(shù)組的開頭(位 置 0)開始向后查找,lastIndexOf()方法則從數(shù)組的末尾開始向前查找。 這兩個(gè)方法都返回要查找的項(xiàng)在數(shù)組中的位置,或者在沒(méi)找到的情況下返回?1。在比較第一個(gè)參數(shù)與數(shù)組中的每一項(xiàng)時(shí),會(huì)使用全等操作符;也就是說(shuō),要求查找的項(xiàng)必須嚴(yán)格相等(就像使用===一樣)。 eg1: var numbers = [1,2,3,4,5,4,3,2,1];console.log(numbers.indexOf(4)); //3 console.log(numbers.lastIndexOf(4)); //5 console.log(numbers.indexOf(4, 4)); //5 console.log(numbers.lastIndexOf(4, 4)); //3 console.log(numbers.indexOf("4")); //-1 eg2: var person = { name: "Nicholas" }; var morePeople = [person]; var people = [{ name: "Nicholas" }];console.log(people); // [Object { name="Nicholas"}] console.log(morePeople); //[Object { name="Nicholas"}] console.log(people==morePeople); //false ???? console.log(people.indexOf(person)); //-1 ??? console.log(morePeople.indexOf(person)); //0 為什么people==morePeople結(jié)果為false??? 數(shù)組是對(duì)象,不能直接比較的。 使用 indexOf()和 lastIndexOf()方法查找特定項(xiàng)在數(shù)組中的位置非常簡(jiǎn)單,支持它們的瀏覽器包 括 IE9+、Firefox 2+、Safari 3+、Opera 9.5+和 Chrome。 ? 5.2.8 迭代方法 ? ECMAScript 5 為數(shù)組定義了 5 個(gè)迭代方法。每個(gè)方法都接收兩個(gè)參數(shù):要在每一項(xiàng)上運(yùn)行的函數(shù)和 (可選的)運(yùn)行該函數(shù)的作用域?qū)ο蟆绊?this 的值。傳入這些方法中的函數(shù)會(huì)接收三個(gè)參數(shù):數(shù) 組項(xiàng)的值、該項(xiàng)在數(shù)組中的位置和數(shù)組對(duì)象本身。根據(jù)使用的方法不同,這個(gè)函數(shù)執(zhí)行后的返回值可能 會(huì)也可能不會(huì)影響方法的返回值。以下是這 5 個(gè)迭代方法的作用。
  • every():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回 true,則返回 true。
  • filter():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回 true 的項(xiàng)組成的數(shù)組。
  • forEach():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)。這個(gè)方法沒(méi)有返回值。
  • map():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組。
  • some():對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)任一項(xiàng)返回 true,則返回 true。
以上方法都不會(huì)修改數(shù)組中的包含的值。 在這些方法中,最相似的是 every()和 some(),它們都用于查詢數(shù)組中的項(xiàng)是否滿足某個(gè)條件。 對(duì) every()來(lái)說(shuō),傳入的函數(shù)必須對(duì)每一項(xiàng)都返回 true,這個(gè)方法才返回 true;否則,它就返回 false。而 some()方法則是只要傳入的函數(shù)對(duì)數(shù)組中的某一項(xiàng)返回 true,就會(huì)返回 true。 eg: var numbers = [1,2,3,4,5,4,3,2,1];var everyResult = numbers.every(function(item, index, array){return (item > 2);}); console.log(everyResult); //falsevar someResult = numbers.some(function(item, index, array){return (item > 2);}); console.log(someResult); //truevar filterResult = numbers.filter(function(item, index, array){return (item > 2);}); console.log(filterResult); // [3, 4, 5, 4, 3]var mapResult = numbers.map(function(item, index, array){return item * 2;}); console.log(mapResult); // [2, 4, 6, 8, 10, 8, 6, 4, 2] filter()方法對(duì)查詢符合某些條件的所有數(shù)組項(xiàng)非常有用。 map()也返回一個(gè)數(shù)組,而這個(gè)數(shù)組的每一項(xiàng)都是在原始數(shù)組中的對(duì)應(yīng)項(xiàng)上運(yùn)行傳入函數(shù)的結(jié)果。這個(gè)方法適合創(chuàng)建包含的項(xiàng)與另一個(gè)數(shù)組 一一對(duì)應(yīng)的數(shù)組。 ? 最后一個(gè)方法是 forEach(),它只是對(duì)數(shù)組中的每一項(xiàng)運(yùn)行傳入的函數(shù)。這個(gè)方法沒(méi)有返回值, 本質(zhì)上與使用 for 循環(huán)迭代數(shù)組一樣。 eg: var numbers = [1,2,3,4,5,4,3,2,1]; numbers.forEach(function(item, index, array){ //執(zhí)行某些操作 }); 這些數(shù)組方法通過(guò)執(zhí)行不同的操作,可以大大方便處理數(shù)組的任務(wù)。支持這些迭代方法的瀏覽器有 IE9+、Firefox 2+、Safari 3+、Opera 9.5+和 Chrome。 ? 5.2.9 歸并方法 ? ECMAScript 5 還新增了兩個(gè)歸并數(shù)組的方法:reduce()和 reduceRight()。這兩個(gè)方法都會(huì)迭代數(shù)組的所有項(xiàng),然后構(gòu)建一個(gè)最終返回的值。其中,reduce()方法從數(shù)組的第一項(xiàng)開始,逐個(gè)遍歷 到最后。而 reduceRight()則從數(shù)組的最后一項(xiàng)開始,向前遍歷到第一項(xiàng)。 這兩個(gè)方法都接收兩個(gè)參數(shù):一個(gè)在每一項(xiàng)上調(diào)用的函數(shù)和(可選的)作為歸并基礎(chǔ)的初始值。傳給 reduce()和 reduceRight()的函數(shù)接收 4 個(gè)參數(shù):前一個(gè)值、當(dāng)前值、項(xiàng)的索引和數(shù)組對(duì)象。這 個(gè)函數(shù)返回的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。第一次迭代發(fā)生在數(shù)組的第二項(xiàng)上,因此第 一個(gè)參數(shù)是數(shù)組的第一項(xiàng),第二個(gè)參數(shù)就是數(shù)組的第二項(xiàng)。 使用 reduce()方法可以執(zhí)行求數(shù)組中所有值之和的操作。 eg: ? ? reduceRight()的作用類似,只不過(guò)方向相反而已。 eg: ? ? 使用 reduce()還是 reduceRight(),主要取決于要從哪頭開始遍歷數(shù)組。除此之外,它們完全 相同。 支持這兩個(gè)歸并函數(shù)的瀏覽器有 IE9+、Firefox 3+、Safari 4+、Opera 10.5 和 Chrome。 ? 5.3 Date類型 ? Date 類型使用自 UTC(Coordinated Universal Time,國(guó)際協(xié)調(diào)時(shí)間)1970 年 1 月 1 日午夜(零時(shí))開始經(jīng)過(guò) 的毫秒數(shù)來(lái)保存日期。在使用這種數(shù)據(jù)存儲(chǔ)格式的條件下,Date 類型保存的日期能夠精確到 1970 年 1 月 1 日之前或之后的 285 616 年。 要?jiǎng)?chuàng)建一個(gè)日期對(duì)象。 eg: var now = new Date(); 在調(diào)用 Date 構(gòu)造函數(shù)而不傳遞參數(shù)的情況下,新創(chuàng)建的對(duì)象自動(dòng)獲得當(dāng)前日期和時(shí)間。如果想根 據(jù)特定的日期和時(shí)間創(chuàng)建日期對(duì)象,必須傳入表示該日期的毫秒數(shù)(即從 UTC 時(shí)間 1970 年 1 月 1 日午 夜起至該日期止經(jīng)過(guò)的毫秒數(shù))。為了簡(jiǎn)化這一計(jì)算過(guò)程,ECMAScript 提供了兩個(gè)方法:Date.parse() 和 Date.UTC()。 (1)Date.parse() 其中,Date.parse()方法接收一個(gè)表示日期的字符串參數(shù),然后嘗試根據(jù)這個(gè)字符串返回相應(yīng)日 期的毫秒數(shù)。ECMA-262 沒(méi)有定義 Date.parse()應(yīng)該支持哪種日期格式,因此這個(gè)方法的行為因?qū)崿F(xiàn) 而異,而且通常是因地區(qū)而異。將地區(qū)設(shè)置為美國(guó)的瀏覽器通常都接受下列日期格式:
  • “月/日/年”,如 6/13/2004;
  • “英文月名 日,年”,如 January 12,2004;
  • “英文星期幾 英文月名 日 年 時(shí):分:秒 時(shí)區(qū)”,如 Tue May 25 2004 00:00:00 GMT-0700。
  • ISO 8601 擴(kuò)展格式 YYYY-MM-DDTHH:mm:ss.sssZ(例如 2004-05-25T00:00:00)。只有兼容
ECMAScript 5 的實(shí)現(xiàn)支持這種格式。 例如,要為 2004 年 5 月 25 日創(chuàng)建一個(gè)日期對(duì)象,可以使用下面的代碼: var someDate = new Date(Date.parse("May 25, 2004")); 如果傳入 Date.parse()方法的字符串不能表示日期,那么它會(huì)返回 NaN。 實(shí)際上,如果直接將表 示日期的字符串傳遞給 Date 構(gòu)造函數(shù),也會(huì)在后臺(tái)調(diào)用 Date.parse()。 var someDate = new Date("May 25, 2004"); 這行代碼將會(huì)得到與前面相同的日期對(duì)象。 ? (2)Date.UTC() Date.UTC()方法同樣也返回表示日期的毫秒數(shù),但它與 Date.parse()在構(gòu)建值時(shí)使用不同的信 息。Date.UTC()的參數(shù)分別是年份、基于 0 的月份(一月是 0,二月是 1,以此類推)、月中的哪一天 (1 到 31)、小時(shí)數(shù)(0 到 23)、分鐘、秒以及毫秒數(shù)。在這些參數(shù)中,只有前兩個(gè)參數(shù)(年和月)是必 需的。如果沒(méi)有提供月中的天數(shù),則假設(shè)天數(shù)為 1;如果省略其他參數(shù),則統(tǒng)統(tǒng)假設(shè)為 0。 eg: ? // GMT時(shí)間2000年1月1日午夜零時(shí) var y2k = new Date(Date.UTC(2000, 0)); console.log(y2k); // Date {Sat Jan 01 2000 08:00:00 GMT+0800 (CST)} // GMT時(shí)間2005年5月5日 下午5:55:55 var allFives = new Date(Date.UTC(2005, 4, 5, 17, 55, 55)); console.log(allFives); //Date {Fri May 06 2005 01:55:55 GMT+0800 (CST)} 如同模仿 Date.parse()一樣,Date 構(gòu)造函數(shù)也會(huì)模仿 Date.UTC(),但有一點(diǎn)明顯不同:日期 和時(shí)間都基于本地時(shí)區(qū)而非 GMT 來(lái)創(chuàng)建。不過(guò),Date 構(gòu)造函數(shù)接收的參數(shù)仍然與 Date.UTC()相同。 因此,如果第一個(gè)參數(shù)是數(shù)值,Date 構(gòu)造函數(shù)就會(huì)假設(shè)該值是日期中的年份,而第二個(gè)參數(shù)是月份, 以此類推。據(jù)此,可以將前面的例子重寫如下。 eg: // GMT時(shí)間2000年1月1日午夜零時(shí) var y2k = new Date(2000, 0); console.log(y2k); // Date {Sat Jan 01 2000 08:00:00 GMT+0800 (CST)} // GMT時(shí)間2005年5月5日 下午5:55:55 var allFives = new Date(2005, 4, 5, 17, 55, 55); console.log(allFives); // Date {Thu May 05 2005 17:55:55 GMT+0800 (CST)} 以上代碼創(chuàng)建了與前面例子中相同的兩個(gè)日期對(duì)象,只不過(guò)這次的日期都是基于系統(tǒng)設(shè)置的本地時(shí) 區(qū)創(chuàng)建的。 ? eg: var newDate = new Date(); //本地時(shí)間 var dateparse = new Date(Date.parse("11/20/2016")) var dateP = new Date("11/20/2016"); var dateUTC = new Date(Date.UTC(2016,10,20,15,55,55)); //UTC時(shí)間,UTC時(shí)間+8=本地時(shí)間 var dateU = new Date(2016,10,20,15,55,55); //本地時(shí)間 console.log(newDate); console.log(dateparse); console.log(dateP); console.log(dateUTC); console.log(dateU); (3)Data.now() ECMAScript 5 添加了 Data.now()方法,返回表示調(diào)用這個(gè)方法時(shí)的日期和時(shí)間的毫秒數(shù)。這個(gè)方 法簡(jiǎn)化了使用 Data 對(duì)象分析代碼的工作。例如: //取得開始時(shí)間 var start = Date.now(); //調(diào)用函數(shù) doSomething(); //取得停止時(shí)間 var stop = Date.now(), result = stop – start; 支持 Data.now()方法的瀏覽器包括 IE9+、Firefox 3+、Safari 3+、Opera 10.5 和 Chrome。在不支 持它的瀏覽器中,使用+操作符把 Data 對(duì)象轉(zhuǎn)換成字符串,也可以達(dá)到同樣的目的。 //取得開始時(shí)間var start = +new Date(); //調(diào)用函數(shù) doSomething(); //取得停止時(shí)間 var stop = +new Date(),result = stop - start; 5.3.1 繼承的方法 與其他引用類型一樣,Date 類型也重寫了 toLocaleString()、toString()和 valueOf()方法; 但這些方法返回的值與其他類型中的方法不同。 Date 類型的 toLocaleString()方法會(huì)按照與瀏覽器 設(shè)置的地區(qū)相適應(yīng)的格式返回日期和時(shí)間。 toString()方法則通常返回帶有時(shí)區(qū)信息的日期和 時(shí)間,其中時(shí)間一般以軍用時(shí)間(即小時(shí)的范圍是 0 到 23)表示。 事實(shí)上, toLocaleString()和 toString()的這一差別僅在調(diào)試代碼時(shí)比較有用,而在顯示日期和時(shí)間時(shí)沒(méi)有 什么價(jià)值。 至于 Date 類型的 valueOf()方法,則根本不返回字符串,而是返回日期的毫秒表示。因此,可以 方便使用比較操作符(小于或大于)來(lái)比較日期值。 eg: var date1 = new Date(2007, 0, 1); var date2 = new Date(2007, 1, 1); console.log(date1 < date2); //true console.log(date1 > date2); //false 5.3.2 日期格式化方法 Date 類型還有一些專門用于將日期格式化為字符串的方法,這些方法如下。
  • toDateString()——以特定于實(shí)現(xiàn)的格式顯示星期幾、月、日和年;
  • toTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒和時(shí)區(qū);
  • toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月、日和年;
  • toLocaleTimeString()——以特定于實(shí)現(xiàn)的格式顯示時(shí)、分、秒;
  • toUTCString()——以特定于實(shí)現(xiàn)的格式完整的 UTC 日期。
與 toLocaleString()和 toString()方法一樣,以上這些字符串格式方法的輸出也是因?yàn)g覽器 而異的,因此沒(méi)有哪一個(gè)方法能夠用來(lái)在用戶界面中顯示一致的日期信息。 5.3.3 日期/時(shí)間組件方法 UTC 日期指的是在沒(méi)有時(shí)區(qū)偏差的情況下(將日期轉(zhuǎn)換為 GMT 時(shí)間) 的日期值。 ? ? 5.4 RegExp類型 ECMAScript 通過(guò) RegExp 類型來(lái)支持正則表達(dá)式。使用下面類似 Perl 的語(yǔ)法,就可以創(chuàng)建一個(gè)正則表達(dá)式。 var expression = / pattern / flags ; 其中的模式(pattern)部分可以是任何簡(jiǎn)單或復(fù)雜的正則表達(dá)式,可以包含字符類、限定符、分組、向前查找以及反向引用。每個(gè)正則表達(dá)式都可帶有一或多個(gè)標(biāo)志(flags),用以標(biāo)明正則表達(dá)式的行為。正則表達(dá)式的匹配模式支持下列 3 個(gè)標(biāo)志。
  • ?g:表示全局(global)模式,即模式將被應(yīng)用于所有字符串,而非在發(fā)現(xiàn)第一個(gè)匹配項(xiàng)時(shí)立即 停止;
  • ?i:表示不區(qū)分大小寫(case-insensitive)模式,即在確定匹配項(xiàng)時(shí)忽略模式與字符串的大小寫;
  • ?m:表示多行(multiline)模式,即在到達(dá)一行文本末尾時(shí)還會(huì)繼續(xù)查找下一行中是否存在與模式匹配的項(xiàng)。
因此,一個(gè)正則表達(dá)式就是一個(gè)模式與上述 3 個(gè)標(biāo)志的組合體。不同組合產(chǎn)生不同結(jié)果。 eg: /* 匹配字符串中所有"at"的實(shí)例 */var pattern1 = /at/g; /* 匹配第一個(gè)"bat"或"cat",不區(qū)分大小寫 */var pattern2 = /[bc]at/i; /* 匹配所有以"at"結(jié)尾的 3 個(gè)字符的組合,不區(qū)分大小寫*/var pattern3 = /.at/gi; 與其他語(yǔ)言中的正則表達(dá)式類似,模式中使用的所有元字符都必須轉(zhuǎn)義。正則表達(dá)式中的元字符包括: ( [ { \ ^ $ | ) ? * + .]} 這些元字符在正則表達(dá)式中都有一或多種特殊用途,因此如果想要匹配字符串中包含的這些字符,就必須對(duì)它們進(jìn)行轉(zhuǎn)義。 eg: /* 匹配第一個(gè)"bat"或"cat",不區(qū)分大小寫 */var pattern1 = /[bc]at/i; /* 匹配第一個(gè)" [bc]at",不區(qū)分大小寫 */var pattern2 = /\[bc\]at/i; /* 匹配所有以"at"結(jié)尾的 3 個(gè)字符的組合,不區(qū)分大小寫 */var pattern3 = /.at/gi; /* 匹配所有".at",不區(qū)分大小寫 */var pattern4 = /\.at/gi; 這些例子都是以字面量形式來(lái)定義的正則表達(dá)式。另一種創(chuàng)建正則表達(dá)式的方式是使用 RegExp 構(gòu)造函數(shù),它接收兩個(gè)參數(shù):一個(gè)是要匹配的字符串模式,另一個(gè)是可選的標(biāo)志字符串。可以 使用字面量定義的任何表達(dá)式,都可以使用構(gòu)造函數(shù)來(lái)定義。 eg: /* 匹配第一個(gè)"bat"或"cat",不區(qū)分大小寫 */var pattern1 = /[bc]at/i; /* 與 pattern1 相同,只不過(guò)是使用構(gòu)造函數(shù)創(chuàng)建的 */var pattern2 = new RegExp("[bc]at", "i"); 在此,pattern1 和 pattern2 是兩個(gè)完全等價(jià)的正則表達(dá)式。要注意的是,傳遞給 RegExp 構(gòu)造 函數(shù)的兩個(gè)參數(shù)都是字符串(不能把正則表達(dá)式字面量傳遞給 RegExp 構(gòu)造函數(shù))。由于 RegExp 構(gòu)造 函數(shù)的模式參數(shù)是字符串,所以在某些情況下要對(duì)字符進(jìn)行雙重轉(zhuǎn)義。所有元字符都必須雙重轉(zhuǎn)義,那 些已經(jīng)轉(zhuǎn)義過(guò)的字符也是如此,例如\n(字符\在字符串中通常被轉(zhuǎn)義為\\,而在正則表達(dá)式字符串中就 會(huì)變成\\\\)。 使用正則表達(dá)式字面量和使用 RegExp 構(gòu)造函數(shù)創(chuàng)建的正則表達(dá)式不一樣。在 ECMAScript 3 中, 正則表達(dá)式字面量始終會(huì)共享同一個(gè)RegExp實(shí)例,而使用構(gòu)造函數(shù)創(chuàng)建的每一個(gè)新RegExp實(shí)例都是一個(gè)新實(shí)例。 ECMAScript 5 明確規(guī)定,使用正則表達(dá)式字面量必須像直接調(diào)用 RegExp 構(gòu)造函數(shù)一樣,每次都創(chuàng) 建新的 RegExp 實(shí)例。IE9+、Firefox 4+和 Chrome 都據(jù)此做出了修改。 ? 5.4.1 RegExp實(shí)例屬性 RegExp 的每個(gè)實(shí)例都具有下列屬性,通過(guò)這些屬性可以取得有關(guān)模式的各種信息。
  • global:布爾值,表示是否設(shè)置了 g 標(biāo)志。
  • ignoreCase:布爾值,表示是否設(shè)置了 i 標(biāo)志。
  • lastIndex:整數(shù),表示開始搜索下一個(gè)匹配項(xiàng)的字符位置,從 0 算起。
  • multiline:布爾值,表示是否設(shè)置了 m 標(biāo)志。
  • source:正則表達(dá)式的字符串表示,按照字面量形式而非傳入構(gòu)造函數(shù)中的字符串模式返回。
source 屬性保存的是規(guī)范形式的字符串,即字面量形式所用的字符串。 ? 5.4.2 RegExp實(shí)例方法 (1)exec() RegExp 對(duì)象的主要方法是 exec(),該方法是專門為捕獲組而設(shè)計(jì)的。exec()接受一個(gè)參數(shù),即 要應(yīng)用模式的字符串,然后返回包含第一個(gè)匹配項(xiàng)信息的數(shù)組;或者在沒(méi)有匹配項(xiàng)的情況下返回 null。 返回的數(shù)組雖然是 Array 的實(shí)例,但包含兩個(gè)額外的屬性:index 和 input。其中,index 表示匹配 項(xiàng)在字符串中的位置,而 input 表示應(yīng)用正則表達(dá)式的字符串。在數(shù)組中,第一項(xiàng)是與整個(gè)模式匹配 的字符串,其他項(xiàng)是與模式中的捕獲組匹配的字符串(如果模式中沒(méi)有捕獲組,則該數(shù)組只包含一項(xiàng))。 eg: var text = "mom and dad and baby"; var pattern = /mom( and dad( and baby)?)?/gi; var matches = pattern.exec(text); console.log(matches.index);//0 console.log(matches.input);// "mom and dad and baby" console.log(matches[0]);// "mom and dad and baby" console.log(matches[1]);// " and dad and baby" console.log(matches[2]);// " and baby" 對(duì)于 exec()方法而言,即使在模式中設(shè)置了全局標(biāo)志(g),它每次也只會(huì)返回一個(gè)匹配項(xiàng)。在不 設(shè)置全局標(biāo)志的情況下,在同一個(gè)字符串上多次調(diào)用 exec()將始終返回第一個(gè)匹配項(xiàng)的信息。而在設(shè) 置全局標(biāo)志的情況下,每次調(diào)用 exec()則都會(huì)在字符串中繼續(xù)查找新匹配項(xiàng)。 eg: var text = "cat, bat, sat, fat"; var pattern1 = /.at/; var matches = pattern1.exec(text);console.log(matches.index); //0 console.log(matches[0]); //cat console.log(pattern1.lastIndex); //0 matches = pattern1.exec(text);console.log(matches.index); //0 console.log(matches[0]); //cat console.log(pattern1.lastIndex); //0var pattern2 = /.at/g; var matches = pattern2.exec(text);console.log(matches.index); //0 console.log(matches[0]); //cat console.log(pattern2.lastIndex); //3 IE 的 JavaScript 實(shí)現(xiàn)在 lastIndex 屬性上存在偏差,即使在非全局模式下, lastIndex 屬性每次也會(huì)變化。 ? (2)test() test(),它接受一個(gè)字符串參數(shù)。在模式與該參數(shù)匹配的情況下返回 true;否則,返回 false。在只想知道目標(biāo)字符串與某個(gè)模式是否匹配,但不需要知道其文本內(nèi)容的 情況下,使用這個(gè)方法非常方便。因此,test()方法經(jīng)常被用在 if 語(yǔ)句中 eg: ? 這種用法經(jīng)常出現(xiàn)在驗(yàn)證用戶輸入的情況下,因?yàn)槲覀冎幌胫垒斎胧遣皇怯行А?/span> (3) RegExp 實(shí)例繼承的 toLocaleString()和 toString()方法都會(huì)返回正則表達(dá)式的字面量,與創(chuàng) 建正則表達(dá)式的方式無(wú)關(guān)。 eg: var pattern = new RegExp("\\[bc\\]at", "gi"); alert(pattern.toString()); // /\[bc\]at/gi alert(pattern.toLocaleString()); // /\[bc\]at/gi 即使上例中的模式是通過(guò)調(diào)用 RegExp 構(gòu)造函數(shù)創(chuàng)建的,但 toLocaleString()和 toString() 方法仍然會(huì)像它是以字面量形式創(chuàng)建的一樣顯示其字符串表示。 正則表達(dá)式的 valueOf()方法返回正則表達(dá)式本身。 ? 5.4.3 RegExp構(gòu)造函數(shù)屬性 RegExp 構(gòu)造函數(shù)包含一些屬性(這些屬性在其他語(yǔ)言中被看成是靜態(tài)屬性)。這些屬性適用于作用域中的所有正則表達(dá)式,并且基于所執(zhí)行的最近一次正則表達(dá)式操作而變化。關(guān)于這些屬性的另一個(gè)獨(dú)特之處,就是可以通過(guò)兩種方式訪問(wèn)它們。換句話說(shuō),這些屬性分別有一個(gè)長(zhǎng)屬性名和一個(gè)短屬性名 (Opera 是例外,它不支持短屬性名)。下表列出了 RegExp 構(gòu)造函數(shù)的屬性。 RegExp 構(gòu)造函數(shù)的各個(gè)屬性返回了下列值:
  • ?input 屬性返回了原始字符串;
  • ?leftContext 屬性返回了單詞 short 之前的字符串,而 rightContext 屬性則返回了 short
之后的字符串;
  • ?lastMatch 屬性返回最近一次與整個(gè)正則表達(dá)式匹配的字符串,即 short;
  • ?lastParen 屬性返回最近一次匹配的捕獲組,即例子中的 s。
eg1: var text = "this has been a short summer"; var pattern = /(.)hort/g; /* 注意:Opera 不支持 input、lastMatch、lastParen 和 multiline 屬性 ; Internet Explorer 不支持 multiline 屬性*/if (pattern.test(text)){console.log(RegExp.input); //this has been a short summerconsole.log(RegExp.leftContext); //this has been a console.log(RegExp.rightContext); // summerconsole.log(RegExp.lastMatch); //shortconsole.log(RegExp.lastParen); //sconsole.log(RegExp.multiline); //false } eg2: var text = "this has been a short summer"; var pattern = /(.)hort/g; /* 注意:Opera 不支持 input、lastMatch、lastParen 和 multiline 屬性 ; Internet Explorer 不支持 multiline 屬性*/if (pattern.test(text)){console.log(RegExp.$_); //this has been a short summerconsole.log(RegExp["$`"]); //this has been a console.log(RegExp["$'"]); // summerconsole.log(RegExp["$&"]); //shortconsole.log(RegExp["$+"]); //sconsole.log(RegExp["$*"]); //false } 除了上面介紹的幾個(gè)屬性之外,還有多達(dá) 9 個(gè)用于存儲(chǔ)捕獲組的構(gòu)造函數(shù)屬性。訪問(wèn)這些屬性的語(yǔ) 法是 RegExp.$1、RegExp.$2...RegExp.$9,分別用于存儲(chǔ)第一、第二......第九個(gè)匹配的捕獲組。在 調(diào)用 exec()或 test()方法時(shí),這些屬性會(huì)被自動(dòng)填充。 eg: var text = "this has been a short summer"; var pattern = /(..)or(.)/g; if (pattern.test(text)){alert(RegExp.$1); //sh alert(RegExp.$2); //t } 5.4.4 模式的局限性 盡管 ECMAScript 中的正則表達(dá)式功能還是比較完備的,但仍然缺少某些語(yǔ)言(特別是 Perl)所支 持的高級(jí)正則表達(dá)式特性。下面列出了 ECMAScript 正則表達(dá)式不支持的特性(要了解更多相關(guān)信息, 請(qǐng)?jiān)L問(wèn) www.regular-expressions.info)。
  • 匹配字符串開始和結(jié)尾的\A 和\Z 錨;但支持以插入符號(hào)(^)和美元符號(hào)($)來(lái)匹配字符串的開始和結(jié)尾。
  • 向后查找(lookbehind);但完全支持向前查找(lookahead)。
  • 并集和交集類
  • 原子組(atomic grouping)
  • Unicode 支持(單個(gè)字符除外,如\uFFFF)
  • 命名的捕獲組;但支持編號(hào)的捕獲組。
  • s(single,單行)和 x(free-spacing,無(wú)間隔)匹配模式
  • 條件匹配
  • 正則表達(dá)式注釋
? 5.5 Function類型 函數(shù)實(shí)際 上是對(duì)象。每個(gè)函數(shù)都是 Function 類型的實(shí)例,而且都與其他引用類型一樣具有屬性和方法。由于函 數(shù)是對(duì)象,因此函數(shù)名實(shí)際上也是一個(gè)指向函數(shù)對(duì)象的指針,不會(huì)與某個(gè)函數(shù)綁定。 1.函 數(shù)聲明語(yǔ)法定義 function sum (num1, num2) { return num1 + num2; } 2.函數(shù)表達(dá)式定義函數(shù) var sum = function(num1, num2){ return num1 + num2; }; 通過(guò)變量 sum 即可以引 用函數(shù)。另外,還要注意函數(shù)末尾有一個(gè)分號(hào),就像聲明其他變量時(shí)一樣。 3.Function 構(gòu)造函數(shù) var sum = new Function("num1", "num2", "return num1 + num2"); // 不推薦 Function 構(gòu)造函數(shù)可以接收任意數(shù)量的參數(shù), 但最后一個(gè)參數(shù)始終都被看成是函數(shù)體,而前面的參數(shù)則枚舉出了新函數(shù)的參數(shù)。 從技術(shù)角度講,這是一個(gè)函數(shù)表達(dá)式。但是,我們不推薦讀者使用這種方法定義函數(shù),因?yàn)檫@種語(yǔ) 法會(huì)導(dǎo)致解析兩次代碼(第一次是解析常規(guī) ECMAScript 代碼,第二次是解析傳入構(gòu)造函數(shù)中的字符串), 從而影響性能。 5.5.1 沒(méi)有重載(深入理解) 聲明了兩個(gè)同名函數(shù),而結(jié)果則是后面的函數(shù)覆蓋了前面的函數(shù)。 eg: var sum = function(a,b){ return a+b; };var othersum = sum;var sum = function(c,d){ return c+2*d; };console.log(sum(10,10)); //30 console.log(othersum(10,10));//20 5.5.2 函數(shù)聲明與函數(shù)表達(dá)式 解析器會(huì)率先讀取函數(shù)聲明,并使其在執(zhí)行任何代碼之前可用(可以訪問(wèn));至于函數(shù)表達(dá)式,則必須等到解析器執(zhí)行到它所在的代碼行,才會(huì)真 正被解釋執(zhí)行。 eg1: console.log(sum(10,10)); function sum(num1, num2){ return num1 + num2; } //20 分析:因?yàn)樵诖a開始執(zhí)行之前,解析器就已經(jīng)通過(guò)一個(gè)名為函數(shù)聲明提升 (function declaration hoisting)的過(guò)程,讀取并將函數(shù)聲明添加到執(zhí)行環(huán)境中。對(duì)代碼求值時(shí),JavaScript 引擎在第一遍會(huì)聲明函數(shù)并將它們放到源代碼樹的頂部。所以,即使聲明函數(shù)的代碼在調(diào)用它的代碼后 面,JavaScript 引擎也能把函數(shù)聲明提升到頂部。 eg2: console.log(sumn(10,10)); var sumn = function(num1, num2){ return num1 + num2; }; //Uncaught TypeError: sumn is not a function(…) 分析:在執(zhí)行到函數(shù)所在的語(yǔ)句之前,變量 sum 中不會(huì)保存有對(duì)函數(shù)的引用;而且,由于第一 行代碼就會(huì)導(dǎo)致“unexpected identifier”(意外標(biāo)識(shí)符)錯(cuò)誤,實(shí)際上也不會(huì)執(zhí)行到下一行。 ? 也可以同時(shí)使用函數(shù)聲明和函數(shù)表達(dá)式,例如 var sum = function sum(){}。 不過(guò),這種語(yǔ)法在 Safari 中會(huì)導(dǎo)致錯(cuò)誤。 ? 5.5.3 作為值的函數(shù) 因?yàn)?ECMAScript 中的函數(shù)名本身就是變量,所以函數(shù)也可以作為值來(lái)使用。也就是說(shuō),不僅可以 像傳遞參數(shù)一樣把一個(gè)函數(shù)傳遞給另一個(gè)函數(shù),而且可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的結(jié)果返回。 eg: function callSomeFunction(someFunction, someArgument){ return someFunction(someArgument); } function add10(num){ return num + 10; } var result1 = callSomeFunction(add10, 10); console.log(result1); //20 function getGreeting(name){ return "Hello, " + name; } var result2 = callSomeFunction(getGreeting, "Nicholas"); console.log(result2); //"Hello, Nicholas" 這個(gè)函數(shù)接受兩個(gè)參數(shù)。第一個(gè)參數(shù)應(yīng)該是一個(gè)函數(shù),第二個(gè)參數(shù)應(yīng)該是要傳遞給該函數(shù)的一個(gè)值。 要訪問(wèn)函數(shù)的指針而不執(zhí)行函數(shù)的話,必須去掉函數(shù)名后 面的那對(duì)圓括號(hào)。 假設(shè)有一個(gè) 對(duì)象數(shù)組,我們想要根據(jù)某個(gè)對(duì)象屬性對(duì)數(shù)組進(jìn)行排序。而傳遞給數(shù)組 sort()方法的比較函數(shù)要接收 兩個(gè)參數(shù),即要比較的值。可是,我們需要一種方式來(lái)指明按照哪個(gè)屬性來(lái)排序。要解決這個(gè)問(wèn)題, 可以定義一個(gè)函數(shù),它接收一個(gè)屬性名,然后根據(jù)這個(gè)屬性名來(lái)創(chuàng)建一個(gè)比較函數(shù)。 eg: //從小到大排序 function createComparisonFunction(propertyName) { return function(object1, object2){ var value1 = object1[propertyName]; var value2 = object2[propertyName]; if (value1 < value2){ return -1; } else if (value1 > value2){ return 1; } }; } var data = [{name: "Zachary", age: 28}, {name: "Nicholas", age: 29}];data.sort(createComparisonFunction("name")); console.log(data[0].name); //Nicholas data.sort(createComparisonFunction("age")); console.log(data[0].name); //Zachary 5.5.4 函數(shù)內(nèi)部屬性 1.arguments 在函數(shù)內(nèi)部,有兩個(gè)特殊的對(duì)象:arguments 和 this。其中,arguments是一個(gè)類數(shù)組對(duì)象,包含著傳入函數(shù)中的所有參數(shù)。雖然 arguments 的主要用途是保存函數(shù)參數(shù), 但這個(gè)對(duì)象還有一個(gè)名叫 callee 的屬性,該屬性是一個(gè)指針,指向擁有這個(gè)arguments 對(duì)象的函數(shù)。 eg: //經(jīng)典階乘函數(shù) function factorial(num){ if (num <=1) { return 1; } else { return num * factorial(num-1) } } console.log(factorial(5)); //120 定義階乘函數(shù)一般都要用到遞歸算法;這個(gè)函數(shù)的執(zhí)行與函數(shù)名 factorial 緊緊耦合在了一起。為 了消除這種緊密耦合的現(xiàn)象,可以像下面這樣使用 arguments.callee。 eg: function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1) } }; console.log(factorial(5)); //120 在這個(gè)重寫后的 factorial()函數(shù)的函數(shù)體內(nèi),沒(méi)有再引用函數(shù)名 factorial。這樣,無(wú)論引用 函數(shù)時(shí)使用的是什么名字,都可以保證正常完成遞歸調(diào)用。 eg1: function factorial(num){ if (num <=1) { return 1; } else { return num * arguments.callee(num-1) } };var trueFactorial = factorial;factorial = function(){ return 0; };console.log(trueFactorial(5)); //120 console.log(factorial(5)); //0 分析: var trueFactorial = factorial,實(shí)際上是在另一個(gè)位置上保存了一個(gè)函數(shù) 的指針。 eg2: function factorial(num){
  if (num <=1) {return 1;} else {return num * factorial(num-1)} };var trueFactorial = factorial;factorial = function(){ return 0; };console.log(trueFactorial(5)); //0 console.log(factorial(5)); //0 2.this 函數(shù)內(nèi)部的另一個(gè)特殊對(duì)象是 this,其行為與 Java 和 C#中的 this 大致類似。換句話說(shuō),this 引用的是函數(shù)據(jù)以執(zhí)行的環(huán)境對(duì)象——或者也可以說(shuō)是 this 值(當(dāng)在網(wǎng)頁(yè)的全局作用域中調(diào)用函數(shù)時(shí), this 對(duì)象引用的就是 window)。 eg: window.color = "red"; var o = { color: "blue" }; function sayColor(){ console.log(this.color); } sayColor(); // red o.sayColor = sayColor; o.sayColor(); // blue 分析:函數(shù) sayColor()是在全局作用域中定義的,它引用了 this 對(duì)象。當(dāng)在全局作用域中調(diào)用 sayColor()時(shí),this 引用的是全局對(duì)象 window;而當(dāng)把這個(gè)函數(shù)賦給對(duì)象 o 并調(diào)用 o.sayColor() 2 時(shí),this 引用的是對(duì)象 o。 函數(shù)的名字僅僅是一個(gè)包含指針的變量而已。因此,即使是 在不同的環(huán)境中執(zhí)行,全局的 sayColor()函數(shù)與 o.sayColor()指向的仍然是同一 個(gè)函數(shù)。 ? ECMAScript 5 也規(guī)范化了另一個(gè)函數(shù)對(duì)象的屬性:caller。除了 Opera 的早期版本不支持,其他 4 瀏覽器都支持這個(gè) ECMAScript 3 并沒(méi)有定義的屬性。這個(gè)屬性中保存著調(diào)用當(dāng)前函數(shù)的函數(shù)的引用, 如果是在全局作用域中調(diào)用當(dāng)前函數(shù),它的值為 null。 eg: function outer(){ inner(); }; function inner(){ alert(inner.caller); }; outer(); //function outer(){inner();} 分析:因?yàn)?outer()調(diào)用了 inter(),所以inner.caller 就指向 outer()。為了實(shí)現(xiàn)更松散的耦合,也可以通過(guò) arguments.callee.caller來(lái)訪問(wèn)相同的信息。 eg: function outer(){ inner();}

function inner(){ alert(arguments.callee.caller); } outer(); // function outer(){inner();} IE、Firefox、Chrome 和 Safari 的所有版本以及 Opera 9.6 都支持 caller 屬性。 當(dāng)函數(shù)在嚴(yán)格模式下運(yùn)行時(shí),訪問(wèn) arguments.callee 會(huì)導(dǎo)致錯(cuò)誤。ECMAScript 5 還定義了 arguments.caller 屬性,但在嚴(yán)格模式下訪問(wèn)它也會(huì)導(dǎo)致錯(cuò)誤,而在非嚴(yán)格模式下這個(gè)屬性始終是 undefined。定義這個(gè)屬性是為了分清 arguments.caller 和函數(shù)的 caller 屬性。以上變化都是為 了加強(qiáng)這門語(yǔ)言的安全性,這樣第三方代碼就不能在相同的環(huán)境里窺視其他代碼了。 嚴(yán)格模式還有一個(gè)限制:不能為函數(shù)的 caller 屬性賦值,否則會(huì)導(dǎo)致錯(cuò)誤。 ? 5.5.5 函數(shù)屬性和方法 ? ?

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

總結(jié)

以上是生活随笔為你收集整理的javascript高级程序设计 学习笔记 第五章 上的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

91九色porny在线 | 黄p网站在线观看 | 天天躁天天操 | 国产一性一爱一乱一交 | 日韩精品欧美一区 | 天天操天天综合网 | avove黑丝 | 又黄又爽的免费高潮视频 | 91亚洲网 | 久久一级片 | 久久激情日本aⅴ | 伊人久久影视 | 欧美日韩免费观看一区二区三区 | 免费看黄20分钟 | 超碰97成人| 久久三级毛片 | 亚洲精品系列 | 日韩二区三区在线 | 久久久久久久网 | 视频在线观看日韩 | 日本精品视频在线观看 | 在线观看一区 | 天天操天天爽天天干 | 超碰电影在线观看 | 友田真希x88av | 99久久er热在这里只有精品15 | free. 性欧美.com | 高清精品久久 | 欧美精品一区二区在线播放 | 国产成人精品av在线 | 亚洲色图av | 婷婷色网址 | 天天干天天操天天爱 | 亚洲综合精品在线 | 婷婷久久婷婷 | 91精品国产亚洲 | 黄色小视频在线观看免费 | 亚洲成熟女人毛片在线 | 国内视频一区二区 | 免费国产一区二区视频 | 91在线精品播放 | 伊人久久精品久久亚洲一区 | 久久福利在线 | 国产精品一区二区三区99 | 日韩精品大片 | 黄免费网站 | 精品一区二三区 | 蜜臀精品久久久久久蜜臀 | 国产成人精品久久久 | 国产在线视频一区二区三区 | a视频在线观看 | 少妇av片 | 欧洲成人av| 少妇高潮流白浆在线观看 | 午夜视频导航 | av电影免费在线播放 | 在线观看av免费观看 | 国产精品久久久久久久久久久久午夜片 | 天天综合中文 | 天天操天天射天天插 | 欧美一级特黄高清视频 | 最新国产精品视频 | 啪啪免费试看 | 国产九色在线播放九色 | 成人av在线网址 | 国产成人av电影在线 | 国产成人资源 | 色视频网站免费观看 | 日本精品在线 | 亚洲精品视频在线免费播放 | 国产精品永久在线观看 | 中文字幕av在线播放 | 国产成人av片 | 久久久综合精品 | 国产精品videoxxxx | 欧美日韩国产精品一区二区亚洲 | av黄色成人 | 国产精品99久久久久人中文网介绍 | 亚洲成人精品久久 | 最新av在线免费观看 | 在线观看一| 久久电影网站中文字幕 | 日本在线视频一区二区三区 | 国产一区二区高清不卡 | 九热精品| 久久精品国产精品亚洲 | 中文字幕高清视频 | 在线播放91 | 91禁在线观看 | 精品免费国产一区二区三区四区 | 欧美性色19p| 日韩网站在线 | 免费观看性生交 | 中文在线字幕观看电影 | 久久一级电影 | 久久精品免费看 | 波多野结衣电影一区二区 | 青青草在久久免费久久免费 | 日韩av免费在线看 | 免费亚洲精品 | 色婷婷综合久色 | 中文一区在线观看 | 日韩手机视频 | 91精品视频免费在线观看 | 久久一线 | 国产一区二区精品在线 | 国产精品久久久久久久免费大片 | 国产亚洲精品久久久久久无几年桃 | 成年人在线免费视频观看 | 丁香婷婷综合激情五月色 | 日韩黄色免费电影 | 九草在线视频 | 97人人看 | 日日干天天操 | www最近高清中文国语在线观看 | 中国老女人日b | 成人h在线观看 | 国产资源网站 | 亚洲一区二区三区四区在线视频 | 国产色视频网站 | 亚州国产精品视频 | 91免费版成人 | 狠狠干干 | 日韩色av色资源 | 麻豆久久久久久久 | jizzjizzjizz亚洲 | 天天综合网久久 | 国际精品网 | 91麻豆精品国产午夜天堂 | 97久久精品午夜一区二区 | 亚洲精品视频网址 | 日本黄色大片免费 | 天堂av在线网址 | 亚洲综合在线五月 | 日本中文字幕电影在线免费观看 | 久久www免费人成看片高清 | 国产麻豆精品一区二区 | 成年性视频 | 麻豆一精品传二传媒短视频 | 国产精品九九热 | 狠狠狠综合 | 欧美日韩精品在线观看 | 亚洲精品乱码久久久久久蜜桃动漫 | 丁香av| 欧美另类xxx | 麻豆视频免费看 | 天天av资源| 欧美精品三级 | 天天爽人人爽夜夜爽 | 久久久亚洲精品 | 久久久麻豆精品一区二区 | 国内小视频| 伊人资源视频在线 | 久久精品欧美一区二区三区麻豆 | 久草在线视频国产 | 九月婷婷色 | 国产一在线精品一区在线观看 | 久久国产美女 | 亚洲va欧美va人人爽春色影视 | 久久国产精品久久久 | 国产日韩精品久久 | 最新av免费 | 久草电影网 | 亚洲高清视频在线 | 国产黄色一级片 | 国产成人一区二区精品非洲 | 久久久久免费观看 | 中文字幕在线观看视频一区 | 免费观看国产精品视频 | 丁香花在线观看视频在线 | 亚洲第一中文字幕 | 又爽又黄在线观看 | 一级黄色免费 | 看av免费 | 青青草在久久免费久久免费 | 97激情影院 | 一区二区伦理 | 在线天堂中文在线资源网 | 国产精品一区二区三区电影 | 国产精品99久久免费观看 | 黄色网址国产 | 国产三级久久久 | 欧美成人精品在线 | 成人视屏免费看 | 麻豆传媒视频观看 | 亚洲天堂网视频 | 午夜国产一区二区三区四区 | 丝袜美腿亚洲 | 成人免费xxxxxx视频 | 99精品欧美一区二区蜜桃免费 | 亚洲综合在线五月天 | 午夜91视频 | 欧美日韩一区二区免费在线观看 | 美女网站在线观看 | 激情五月婷婷综合网 | 久久久免费毛片 | 久久综合久久综合这里只有精品 | 在线观看黄色的网站 | 69精品在线观看 | 久久官网| 国产高清中文字幕 | 精品国产欧美一区二区 | 九九日九九操 | 久久久噜噜噜久久久 | 亚洲最快最全在线视频 | 狠狠干夜夜操 | 在线免费观看av网站 | 中文字幕免费中文 | 日日夜夜狠狠 | 黄色av电影一级片 | 亚洲黄网站 | 午夜电影 电影 | 国语自产偷拍精品视频偷 | 中文字幕一二三区 | 国产不卡免费视频 | 精品国产成人在线影院 | 在线观看自拍 | 亚洲三级av | 九月婷婷人人澡人人添人人爽 | 日韩肉感妇bbwbbwbbw | www.国产精品 | 狠狠色丁香久久婷婷综 | 亚洲综合在 | 成人中文字幕av | 久草在线视频网 | 男女视频久久久 | 制服丝袜在线 | 欧美大片在线看免费观看 | 在线欧美最极品的av | 日韩久久精品一区二区三区下载 | 高清av免费观看 | 97人人超| av 在线观看| 亚洲国产精品久久久久久 | 国产精品剧情 | 99视频国产精品免费观看 | 超碰个人在线 | 亚洲视频h| 丁香五月网久久综合 | 成人在线视频你懂的 | av国产在线观看 | 99久热在线精品视频成人一区 | 天天操天天玩 | 在线精品亚洲 | 男女激情免费网站 | 日韩精品91偷拍在线观看 | 超碰在线人人 | 久久久2o19精品 | .国产精品成人自产拍在线观看6 | 美女黄频网站 | 人人爽人人插 | 丝袜制服天堂 | 国产精品精品久久久久久 | 成人xxxx| 国产精品自产拍在线观看网站 | 一本大道久久精品懂色aⅴ 五月婷社区 | 国产亚洲91 | 色橹橹欧美在线观看视频高清 | 激情婷婷在线观看 | av在线直接看| 婷婷在线网站 | 国产亚洲精品美女久久 | 国产精品欧美日韩在线观看 | 国内精品久久久久影院日本资源 | 久久综合中文字幕 | 99久久精品午夜一区二区小说 | 丁香六月婷婷综合 | 这里只有精品视频在线 | 992tv人人网tv亚洲精品 | 嫩小bbbb摸bbb摸bbb | 精品久久久久久久久久久久久久久久 | 成人羞羞视频在线观看免费 | 在线观看中文字幕第一页 | 国产精品国产三级国产aⅴ无密码 | 手机在线欧美 | 香蕉在线视频播放网站 | 午夜.dj高清免费观看视频 | 久久综合之合合综合久久 | 天天色中文| 亚洲国产精品久久久 | 久久久91精品国产 | 97韩国电影| avove黑丝 | 免费在线观看av | 国内视频一区二区 | 国产成人一区二区三区在线观看 | 久久久91精品国产 | 国产精品18久久久久久首页狼 | 久久视频精品在线观看 | 国产一区二区不卡视频 | 色久天 | 亚洲精品欧美成人 | 欧美日韩精品在线视频 | 操操操操网| 国产乱对白刺激视频在线观看女王 | 久草精品视频在线看网站免费 | 国产精品久久久久久久久久免费 | 国产99久久九九精品免费 | 久久中文字幕视频 | 国产精品女教师 | 国内小视频在线观看 | 水蜜桃亚洲一二三四在线 | 狠狠色伊人亚洲综合网站野外 | 98涩涩国产露脸精品国产网 | 日韩久久一区 | 在线观看视频国产 | 99精品久久精品一区二区 | 国产精品嫩草影院9 | 天天躁日日躁狠狠躁 | 操操操日日日干干干 | 在线 欧美 日韩 | 午夜视频在线观看欧美 | 亚洲精品国精品久久99热一 | 亚洲精品在线一区二区 | 国产色视频网站2 | 一本一本久久a久久精品牛牛影视 | 欧美在线日韩在线 | 黄色特级片 | 日日狠狠 | 国产 日韩 欧美 自拍 | 一区二区视频在线看 | 久久在线视频在线 | 精品亚洲视频在线 | 99久久精品电影 | 国内少妇自拍视频一区 | 欧美综合色 | 久久综合精品国产一区二区三区 | 天天曰 | 国产精品免费久久 | 久久99热这里只有精品 | 最新av电影网址 | 狠狠伊人 | 毛片一区二区 | 亚洲天天摸日日摸天天欢 | 国产韩国精品一区二区三区 | 成人a在线观看高清电影 | 国产精品一区久久久久 | www.色五月 | 视频一区亚洲 | 不卡的av中文字幕 | 国产精品久久久久久久久久妇女 | 国产又黄又爽又猛视频日本 | 一区二区三区在线免费 | 欧美日韩视频一区二区三区 | 中文字幕在线观看91 | 国产精品一区二区中文字幕 | 最新色站 | 美州a亚洲一视本频v色道 | 久久99精品久久久久婷婷 | 中文字幕在线久一本久 | 五月综合色 | 亚洲国产日韩一区 | 国精产品永久999 | 亚洲精品一区二区三区在线观看 | 97超碰福利久久精品 | 99在线精品视频在线观看 | 亚洲视频精品在线 | 中文字幕乱码电影 | 一级免费黄色 | 色婷婷欧美 | 97精品伊人 | 91在线视频免费观看 | 久久久官网 | 在线有码中文字幕 | 国产精品观看在线亚洲人成网 | 日韩欧美高清 | 午夜久久视频 | 五月激情六月丁香 | 国产精品乱码久久 | 人人爱人人舔 | 国产69精品久久99不卡的观看体验 | 国产精品99久久久久久久久 | 久久免费视频99 | 成年人免费看的视频 | 日韩三级不卡 | 日韩av专区 | 国产精品美女999 | 香蕉免费 | www.777奇米| 在线免费观看一区二区三区 | 激情综合色播五月 | 91桃色在线免费观看 | 在线视频一区二区 | 久久精品屋 | 91视频在线观看大全 | www.com久久久 | 中文字幕在线播放av | 不卡视频国产 | 亚洲成人av一区 | 欧美精品免费在线 | 天天操天天操天天操天天操天天操 | 亚洲性xxxx | 99精品99 | 91麻豆网站 | 国产 欧美 日本 | 日本精品视频在线 | 91九色成人 | 天堂av最新网址 | 91网址在线 | 国产又粗又猛又黄又爽视频 | 国产精品ⅴa有声小说 | 久章草在线观看 | 亚洲视屏在线播放 | 九九在线国产视频 | 一区二区三区免费 | 一区在线免费观看 | 最新av在线网站 | 成人免费 在线播放 | 国产成人精品在线播放 | 又黄又爽的免费高潮视频 | 国模精品在线 | 9999在线观看 | 国产精品免费一区二区 | 国产一级二级av | 中文字幕日韩精品有码视频 | aa级黄色大片 | 最新真实国产在线视频 | 中文字幕永久 | 99久久精品免费看国产一区二区三区 | av理论电影 | 久久国产精品久久精品国产演员表 | 玖玖在线免费视频 | 中文字幕网站视频在线 | 婷婷成人在线 | 四虎在线免费视频 | 国产三级国产精品国产专区50 | 成人av一区二区兰花在线播放 | 国产精品免费在线视频 | 91精品国产乱码在线观看 | www.色综合.com | 精品二区久久 | 日韩视频专区 | 高清不卡毛片 | 久久黄色免费观看 | 国产999精品久久久久久麻豆 | 欧美国产视频在线 | 欧美色操| 日本中文字幕免费观看 | 精品视频免费看 | 九九免费精品视频 | 国产中文字幕一区二区三区 | 免费看的毛片 | 亚洲三级性片 | 国产a国产a国产a | 国产精品久免费的黄网站 | 午夜精品福利一区二区三区蜜桃 | 狠狠狠狠狠狠狠干 | 欧美日韩国产一区 | 九九九热精品 | 国产专区视频在线观看 | 国产成人在线免费观看 | 少妇性色午夜淫片aaaze | 国产 日韩 在线 亚洲 字幕 中文 | 久久视频在线观看免费 | 天堂网一区二区 | 久精品在线 | 日韩精品中文字幕久久臀 | 91麻豆精品国产 | 日韩首页| 日韩欧美在线观看一区 | 日韩av片无码一区二区不卡电影 | 五月天天色 | 国产精品一区二区久久国产 | 亚洲视频资源在线 | 国产成人精品亚洲日本在线观看 | 又爽又黄又刺激的视频 | 手机看片99 | 国产精品一级视频 | 久久久久免费电影 | 91免费高清观看 | 免费在线观看视频一区 | 97人人超碰在线 | 久久xxxx| 最近中文字幕免费av | 欧美成人性战久久 | 91在线免费视频 | 亚洲国产丝袜在线观看 | 国产成人av在线影院 | 久久这里只有精品23 | 国产福利精品在线观看 | 911精品美国片911久久久 | 81国产精品久久久久久久久久 | 国产日产av | 亚洲国产福利视频 | 五月天久久久久 | 欧美在线观看视频免费 | 久久高清国产 | av一级网站 | 五月婷久久 | 久久综合久久综合久久 | 亚洲成人精品久久久 | 999久久精品 | 97视频中文字幕 | 精品96久久久久久中文字幕无 | 亚洲专区免费观看 | 在线观看你懂的网址 | 国产黄色大全 | 丝袜美腿av | 欧美一二区在线 | 国产精品久久9 | 成人日韩av| 看全黄大色黄大片 | 日韩欧美有码在线 | 久久久www成人免费精品张筱雨 | 在线a亚洲视频播放在线观看 | 欧美亚洲精品一区 | 免费观看的黄色 | 五月婷婷,六月丁香 | 国产精品麻豆一区二区三区 | 国产黄色精品在线 | 特级西西www44高清大胆图片 | 亚洲理论视频 | 久久视频这里有精品 | 视频一区二区视频 | 97看片 | 激情婷婷 | 黄污网站在线观看 | 69av网| 99草在线视频 | 黄色国产高清 | 91av视频在线观看免费 | 天天插天天色 | 最近免费中文字幕 | 免费看v片网站 | 国产精品小视频网站 | 色com| 国产精品久久久一区二区三区网站 | 日日夜夜天天久久 | 在线国产一区 | 国产一级特黄电影 | 久久久久久综合 | 亚洲女欲精品久久久久久久18 | 日韩精品一区二区久久 | 婷婷综合五月天 | 久久国产精品免费看 | 中文字幕字幕中文 | 免费看三级网站 | 国产剧情一区在线 | 西西44人体做爰大胆视频 | 激情综合网五月激情 | 欧美久久久久久久久久久久久 | 久久情网 | 日韩欧美一区二区三区黑寡妇 | 亚洲天天综合 | 午夜视频在线观看欧美 | 中文字幕av电影下载 | 国产二区av | 成人久久久久 | 99在线高清视频在线播放 | 91麻豆精品国产91久久久久久 | 亚洲精品午夜久久久久久久 | 午夜视频在线观看欧美 | 一区二区三区动漫 | 91精品蜜桃| 国内精品视频在线 | 国产日产精品一区二区三区四区 | 日日操天天射 | 国产资源网 | 日韩精品亚洲专区在线观看 | 日韩欧美xxx | 日韩精品中字 | 亚洲欧洲日韩在线观看 | 就要干b| 91丨九色丨91啦蝌蚪老版 | 深夜免费网站 | 午夜精品电影 | 九九色在线 | 99精品视频免费在线观看 | 日本一区二区免费在线观看 | 久久爱综合 | 久久欧美综合 | 国产精品免费久久久久久 | 人人草在线观看 | 91亚洲精品国偷拍 | 国产精品麻豆三级一区视频 | 亚洲电影在线看 | 国产黄色看片 | 国产亚洲婷婷 | 色夜影院 | 中文字幕有码在线观看 | 国产免码va在线观看免费 | 亚洲日日射| 亚洲成人资源 | 久久视频精品在线 | 99视频精品全部免费 在线 | 亚洲精品福利在线 | 91麻豆精品久久久久久 | 91精品国产乱码在线观看 | 久久人人添人人爽添人人88v | 一区二区三区免费网站 | 欧美性生交大片免网 | 国产在线精品国自产拍影院 | 久久区二区 | 久久久久国产精品一区 | 久久久精品影视 | 99中文字幕 | 色噜噜在线观看视频 | 国产亚洲免费的视频看 | 在线日本看片免费人成视久网 | 不卡的av | 色多多污污 | 亚洲国产中文字幕在线观看 | 尤物九九久久国产精品的分类 | 九九热av | 96精品高清视频在线观看软件特色 | 久亚洲 | 日本久久久亚洲精品 | 国产一区二区精 | 国产999精品久久久久久绿帽 | 在线免费观看国产精品 | 久久久免费观看完整版 | av一级片在线观看 | 在线色资源 | 国产精品视频不卡 | 国产麻豆精品一区二区 | 日韩精品在线视频免费观看 | 国产精品网红直播 | 亚洲小视频在线 | 一区二区三区免费网站 | 99久久国产免费,99久久国产免费大片 | 国产一级久久久 | 国产中文a| 综合天天色 | 九九免费精品视频在线观看 | 天天亚洲综合 | 在线观看av不卡 | 美女视频久久 | 91探花视频 | 日韩手机视频 | 超碰在线公开 | 久久久国产精品麻豆 | 亚洲视频免费在线观看 | 你操综合 | 在线黄色国产电影 | 狠狠成人 | 久久久综合九色合综国产精品 | 亚洲第一香蕉视频 | 婷婷五天天在线视频 | 国精产品999国精产品视频 | 网址你懂的在线观看 | 四虎影视成人永久免费观看视频 | 国产成人精品区 | 日韩av电影中文字幕在线观看 | 91视频免费观看 | 91精品国自产拍天天拍 | 国内精品久久久久久久97牛牛 | 区一区二区三区中文字幕 | 香蕉久久久久久久 | 国产精品三级视频 | 大型av综合网站 | 日本在线观看黄色 | 黄色在线网站噜噜噜 | 欧美一区二区在线 | 国内久久 | 又黄又爽又色无遮挡免费 | 午夜视频黄 | 国产一区视频免费在线观看 | 九九视频精品在线 | 天天操综合网站 | 就色干综合 | www.香蕉视频 | 人人插人人搞 | 亚洲区视频在线观看 | 国产精品a久久久久 | 在线观看视频一区二区 | 久久久久久久久久久久亚洲 | 91成人在线观看喷潮 | 久久久久久久毛片 | 欧美黑吊大战白妞欧美 | 国产在线97 | 天天综合亚洲 | 在线视频日韩一区 | 91av在 | 狠狠搞,com | 亚洲a在线观看 | 91porny九色91啦中文 | 九九热免费精品视频 | 日韩免费一区二区 | 日本公妇在线观看 | 香蕉视频在线播放 | 成人网页在线免费观看 | 久久久黄色av| 一区二区三区在线视频111 | 激情网五月 | 欧美一级特黄高清视频 | 亚洲最新av在线网站 | 国内久久| 9在线观看免费高清完整版在线观看明 | 五月天亚洲综合小说网 | www.夜夜骑.com | 超级碰视频 | 国产精品视频地址 | 国产97碰免费视频 | 久久久久久亚洲精品 | 免费看十八岁美女 | www.国产视频 | 久久综合久久综合这里只有精品 | 色视频国产直接看 | 九九在线高清精品视频 | 久久精品亚洲国产 | 久操操| 色网影音先锋 | 91大片成人网 | 超碰av在线免费观看 | 免费亚洲精品 | 99在线视频观看 | 国产精品一区二区av日韩在线 | 亚洲欧美视频在线观看 | 久久香蕉电影 | 免费在线观看污 | 免费在线观看黄网站 | 国产一区二区在线播放视频 | 99久久精品免费看国产免费软件 | 中文字幕在线视频国产 | 日韩欧美精品在线 | 在线观看黄污 | 国产999免费视频 | 亚洲乱码国产乱码精品天美传媒 | www.国产在线观看 | 久久国产成人午夜av影院宅 | 伊人天堂网 | 激情欧美在线观看 | 超碰人人91 | 麻豆视频免费入口 | 97香蕉超级碰碰久久免费软件 | 国产黄色在线 | 日韩欧美电影网 | 91久久精品一区二区二区 | 欧美另类xxx | 亚洲精品乱码久久久久久高潮 | 久久香蕉国产 | 久久久精品国产一区二区三区 | 国产在线观看污片 | 欧美日韩高清一区二区 国产亚洲免费看 | 国产精品99久久久久久人免费 | 亚洲经典中文字幕 | 亚洲国产综合在线 | 香蕉影院在线观看 | 亚洲在线黄色 | 婷婷六月丁香激情 | 91毛片在线 | 成人国产综合 | 日韩av快播电影网 | 日韩欧美综合在线视频 | 亚洲无吗天堂 | 日韩理论片在线 | 久久成视频 | 亚洲精欧美一区二区精品 | 天天草av| 91私密保健 | 国内精品一区二区 | 日日射av | 中文字幕免费观看视频 | 伊人狠狠干 | 综合激情| 国产精品第二十页 | 在线精品观看 | 亚洲女同videos | 国产精品一区二区久久精品 | 精品天堂av | 亚洲精品高清视频在线观看 | 久草国产精品 | av7777777 | 久草视频99 | 国产精品美女久久久网av | 天天干天天上 | 国产精品久久久久久69 | 福利电影一区二区 | 国产精品永久在线观看 | 日日夜夜草| 热re99久久精品国产99热 | 很黄很污的视频网站 | 在线观看中文字幕网站 | 在线成人性视频 | 日本在线观看中文字幕 | 成人免费视频网址 | 亚洲人片在线观看 | 亚洲精品xxx| www.在线看片.com | 国产成人精品电影久久久 | 不卡电影免费在线播放一区 | 成人在线免费视频观看 | 亚洲一区二区91 | 夜夜躁日日躁狠狠久久av | av在线com| 国产成人精品av久久 | 99精品视频在线看 | 日日操天天爽 | 欧美日韩在线观看视频 | 国产在线观看99 | 精品久久久99 | 色综合久久久久久久 | 97av视频在线| 五月天久久久 | 国产九九精品视频 | 高清av影院 | 午夜狠狠干 | 久久精品中文字幕 | 美女视频网站久久 | av五月婷婷 | 亚洲成av人片在线观看 | 国产在线观看高清视频 | 久久久久成人精品免费播放动漫 | 九九一级片 | 欧美一级免费黄色片 | 在线亚洲成人 | 狠狠色丁香久久婷婷综合五月 | 日韩在线观看网址 | 日韩一二三区不卡 | 久久国产品 | 色香com. | 成人性生交视频 | 一区二区中文字幕在线播放 | 精品综合久久久 | 一区二区三区三区在线 | 亚洲精品久久久蜜桃直播 | 日韩电影一区二区三区在线观看 | 波多野结衣资源 | 天天综合网久久 | 成人午夜电影免费在线观看 | 久久私人影院 | 少妇bbr搡bbb搡bbb | 人人舔人人爽 | 久久免费成人精品视频 | 欧美ⅹxxxxxx | 欧美有色 | 麻豆系列在线观看 | 成人国产亚洲 | 久久成人国产精品入口 | 欧美va电影 | 在线观看精品一区 | 91av在线免费播放 | 成年人免费观看国产 | 91香蕉视频黄 | 看片的网址 | 五月婷婷综合在线观看 | 91麻豆精品国产91久久久无限制版 | 97成人超碰 | 日韩视频一区二区在线 | 欧美激情精品一区 | 精品国产亚洲在线 | 午夜精品久久久久久久爽 | 天堂激情网 | 久草在线视频网 | 久久99精品国产99久久 | 久久国产精品一二三区 | 欧洲视频一区 | 免费看片黄色 | 欧美激情综合五月色丁香小说 | 国产精品一区二区三区在线免费观看 | 中文字幕区 | 福利视频第一页 | 97人人模人人爽人人喊网 | 91精选在线观看 | 一级国产视频 | 欧美在线视频一区二区三区 | 色操插| 日韩精品一区二区三区免费观看 | 日本不卡一区二区三区在线观看 | 久久成人精品视频 | 91精品国产乱码在线观看 | 中文字幕久久亚洲 | 人人看人人爱 | 亚洲精品国产精品乱码在线观看 | 国产一在线精品一区在线观看 | 久草电影在线 | 成人wwwxxx视频 | 国产成人精品一二三区 | 久久久久久久久久久影视 | 欧美另类xxx | 日韩高清免费无专码区 | 国产原创av在线 | 欧美另类tv | 亚洲精品成人 | 狠狠狠狠狠狠操 | 欧美一区日韩精品 | 成人一区二区在线观看 | 久久中文精品视频 | 日韩在线观看视频在线 | 国产一级淫片在线观看 | 国产麻豆精品久久一二三 | 在线综合 亚洲 欧美在线视频 | 国产成人精品一区二区 | 国产日韩精品在线观看 | 亚洲精品播放 | 国产片免费在线观看视频 | 国内成人精品视频 | 天天天在线综合网 | 免费视频一区 | 亚洲资源在线观看 | 欧美日韩在线精品 | 久久亚洲成人网 | 精品在线小视频 | 99九九视频 | 激情婷婷av | 国产成人精品久久久久蜜臀 | 成年人在线免费视频观看 | 久久久久久激情 | 国产精品一区二区麻豆 | 国产精品永久久久久久久www | 97国产超碰 | 97热在线观看 | 99在线高清视频在线播放 | 911在线| 国产视频欧美视频 | 欧美亚洲国产日韩 | 日韩a免费| 色播五月婷婷 | 中文字幕一区二区三区四区 | 丁香高清视频在线看看 | 91av在线免费视频 | 美女久久久久 | 亚洲欧美国产日韩在线观看 | 午夜电影一区 | 超碰97免费| 国产色在线观看 | 免费av网站在线看 | 在线综合 亚洲 欧美在线视频 | 国产精品一区二区久久精品 | 国产91精品一区二区 | 中文字幕无吗 | 婷婷社区五月天 | 999电影免费在线观看 | 日韩剧 | 丁香六月婷婷开心 | 色网站视频| 国产精品视频观看 | 香蕉精品在线观看 | 国产精品不卡在线播放 | 九九热久久久 | 香蕉视频久久 | 国产一级片直播 | 黄色毛片在线观看 | 日日夜夜亚洲 | 丝袜av一区 | 免费av在 | 国产一区二区三区免费在线观看 | 九九免费在线看完整版 | 久久成人免费 | 日韩精品在线看 | 欧美一级专区免费大片 | 欧美9999| 五月天婷亚洲天综合网鲁鲁鲁 | 国产精品爽爽爽 | 中文字幕 国产 一区 | 欧美日韩裸体免费视频 | 成人黄色影片在线 | 国产一区在线免费观看 | 人人澡人摸人人添学生av | 中文字幕第一页在线播放 | 国产区精品在线观看 | 黄污网站在线观看 | 国产精品女人久久久久久 | 在线观看免费高清视频大全追剧 | 久久午夜鲁丝片 | 天天操天天摸天天干 | 最新日韩在线 | 在线视频中文字幕一区 | 操高跟美女 | 97视频在线播放 | 99久久精品电影 | 青草视频在线播放 | 国产中文字幕在线看 | 狠狠色狠狠色综合系列 | 在线午夜 | 久久人人添人人爽添人人88v | 综合天天色| 99久久婷婷国产精品综合 | 久久激情五月激情 | 亚洲精品动漫在线 | 岛国av在线| av中文天堂在线 | av播放在线 | 黄色成人91 | 免费看黄的视频 | 黄色av免费 | 国产精品一区二区麻豆 | 久久激情电影 | 国内少妇自拍视频一区 | 视频国产在线观看18 | 中文字幕亚洲不卡 | 狠狠色狠狠色合久久伊人 | 一区二区视频在线播放 | 久草网在线视频 | 91精品欧美一区二区三区 | 亚洲精品中文在线观看 | 国产一区福利 | 日韩福利在线观看 | 久久精品视频2 | 三级视频日韩 | 日本久久久久久久久久久 | 免费观看的av网站 | 天堂在线v | 亚洲成熟女人毛片在线 | 免费在线观看污网站 | 五月开心六月婷婷 | 久久精品看片 | 中文字幕在线视频网站 |