閱讀目錄
Object類型
1、通過構(gòu)造函數(shù)來創(chuàng)建
2、通過字面量表示法來創(chuàng)建對(duì)象
Array類型
同樣Array也有兩種創(chuàng)建方式:
如果我們想要打印數(shù)組中所有的值,直接打印數(shù)組的變量名就可以:
往數(shù)組添值:
棧方法、隊(duì)列方法:
關(guān)于數(shù)組的排序:
數(shù)組的一些操作方法:
查找位置方法
迭代方法
歸并方法
Date類型
RegExp類型
Function類型
三種表示法:
方法重載
函數(shù)內(nèi)部屬性(arguments 和 this)
基本包裝類型
瀏覽器的內(nèi)置對(duì)象
URI 編碼方法
總結(jié)
我們?cè)凇兑徊讲綄W(xué)習(xí)javascript基礎(chǔ)篇(1):基本概念》中簡(jiǎn)單的介紹了五種基本數(shù)據(jù)類型Undefined、Null、Boolean、Number和String。今天我們主要介紹下復(fù)雜數(shù)據(jù)類型(即引用數(shù)據(jù)類型)
Object類型
我們用的最多的引用類型就屬object類型了,一般用來存儲(chǔ)和傳輸數(shù)據(jù)是再好不過的。然,它的兩種創(chuàng)建方式我們是否了解呢?
1、通過構(gòu)造函數(shù)來創(chuàng)建
如: var obj = new Object();
在js中的引用類型有個(gè)非常靈活的用法,可以動(dòng)態(tài)的附加屬性和賦值。
如:
var obj = new Object();obj.name = "張三";//動(dòng)態(tài)添加屬性并賦值obj.age = 23;alert(obj.name);
2、通過字面量表示法來創(chuàng)建對(duì)象
現(xiàn)在大家用得比較多的就是字面量表示法來創(chuàng)建對(duì)象了。
如:
var obj = { name: "張三", age: 23};alert(obj.age);
和上面的效果是等效的。通過這樣方式創(chuàng)建感覺結(jié)構(gòu)更加的清晰,更加有封裝的感覺。:)
我們還可以這樣用
如:
var obj = {};obj.name = "張三";obj.age = 23;alert(obj.age);
如:
var obj = { "name": "張三",//給屬性加上雙引號(hào) age: 23};alert(obj.name);
是不是感覺很強(qiáng)大很靈活呢?我在訪問屬性的時(shí)候一般都是點(diǎn)出來,但是還有另外的方式。
如:(我們可以使用中括號(hào)的形式來訪問屬性值)
var obj = { "name tow": "張三", age: 23};//alert(obj.name tow);//這里會(huì)報(bào)錯(cuò),屬性不能有空格alert(obj["name tow"]);//這里可以正常彈出
例:
Array類型
除了object之外,應(yīng)該屬數(shù)組用的最多了。下面來羅列下常見用法。
同樣Array也有兩種創(chuàng)建方式:
var arr = new Array(1, 2, 3, 4, 5);//通過構(gòu)造函數(shù)創(chuàng)建var arr2 = [5, 4, 3, 2, 1];//通過字面量表達(dá)式來創(chuàng)建
上面兩種方式是等效的,我們可以直接通過下標(biāo)的方式來訪問數(shù)組: alert(arr[2]); 。
如果我們想要打印數(shù)組中所有的值,直接打印數(shù)組的變量名就可以:
var arr2 = [5, 4, 3, 2, 1];//通過字面量表達(dá)式來創(chuàng)建var str2 = "";for (var i = 0; i < arr2.length; i++) { str2 += arr2[i] + ","}alert(str2);//打印拼接的字符串 alert(arr2);//直接打印變量名(實(shí)際上會(huì)自動(dòng)調(diào)用數(shù)組的toString方法)
例:
var arr2 = [5, 4, 3, 2, 1];//通過字面量表達(dá)式來創(chuàng)建var str2 = "";for (var i = 0; i < arr2.length; i++) { str2 += arr2[i] + ","}alert(str2);//打印拼接的字符串
例:
var arr2 = [5, 4, 3, 2, 1];//通過字面量表達(dá)式來創(chuàng)建alert(arr2);//直接打印變量名(實(shí)際上會(huì)自動(dòng)調(diào)用數(shù)組的toString方法)
上面直接打印arr2,我們發(fā)現(xiàn)默認(rèn)都是以逗號(hào)分隔的。那么有時(shí)候,我們不想用逗號(hào)怎么辦呢。那你可能可以用到j(luò)oin方法
var arr2 = [5, 4, 3, 2, 1];//通過字面量表達(dá)式來創(chuàng)建alert(arr2.join('_'));//直接打印變量名(實(shí)際上會(huì)自動(dòng)調(diào)用數(shù)組的toString方法)
往數(shù)組添值:
我們可以直接: arr2[4] = 7; arr2[5] = 8;
還有一種更加巧妙地添值方式: arr2[arr2.length] = 9; arr2[arr2.length] = 10; ,下標(biāo)length剛好是數(shù)組最大長(zhǎng)度的下一個(gè),添加值后length再次動(dòng)態(tài)自動(dòng)累計(jì)。
棧方法、隊(duì)列方法:
什么是棧?(后進(jìn)先出)。什么是隊(duì)列?(先進(jìn)先出),我們?cè)鯓佑脭?shù)組來模仿這種數(shù)據(jù)結(jié)構(gòu)的訪問方式?下面通過一張圖來解釋下數(shù)組對(duì)象提供的四個(gè)方法。
從圖可以看出:shift和push、unshift和pop的組合可以實(shí)現(xiàn)棧的數(shù)據(jù)結(jié)構(gòu)訪問,shitf和pop、shift和unshift的組合可以實(shí)現(xiàn)隊(duì)列的數(shù)據(jù)機(jī)構(gòu)訪問方式。 這里需要注意:pop和shift取數(shù)據(jù)的同時(shí),數(shù)組中對(duì)于的值也同時(shí)移除了。
例:
var arr2 = [5, 4, 3, 2, 1];alert("arr2.pop:" + arr2.pop() + " arr2:" + arr2);
關(guān)于數(shù)組的排序:
關(guān)于數(shù)組的排序有sort(正)reverse(反)。
先看個(gè)例子,大家猜想下結(jié)果:
var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort());
然結(jié)果并不是我們想要的:
var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort());
為什么會(huì)這樣呢?因?yàn)閟ort不會(huì)直接比較數(shù)字類型,而已轉(zhuǎn)為string了再做的比較。那么我們想要比較數(shù)字怎辦?我們可以往sort傳函數(shù),例:
function mycompare(o1, o2){ return o1 - o2;//如果為正數(shù)則o1大,負(fù)數(shù)則o2大,零則相等。}var arr2 = [5, 14, 23, 12, 1];alert(arr2.sort(mycompare));
有人會(huì)問o1和o2是怎么來的?這是sort函數(shù)規(guī)定的。這樣說大家可能不好接受。下面,我們自己來模擬下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) {//這里用我們傳進(jìn)來的方法判斷是否要排序調(diào)換位置 var temp = arr2[j]; arr2[j] = arr2[j + 1]; arr2[j + 1] = temp; } } } //*************************************************** return arr2;} function mycompare(o1, o2) { return o1 - o2;//回調(diào)函數(shù)(具體的比較規(guī)則)}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) {//這里用我們傳進(jìn)來的方法判斷是否要排序調(diào)換位置 var temp = arr2[j]; arr2[j] = arr2[j + 1]; arr2[j + 1] = temp; } } } //*************************************************** return arr2;}function mycompare(o1, o2) { return o1 - o2;//回調(diào)函數(shù)(具體的比較規(guī)則)}alert(arr2.mysort(mycompare));
當(dāng)然,我們模擬的并不是那么的好,大概就是這么個(gè)意思。
反序就簡(jiǎn)單了:(直接reverse()就可以了)
function mysort(o1, o2){ return o1 - o2;//如果為正數(shù)則o1大,負(fù)數(shù)則o2大,零則相等。}var arr2 = [5, 14, 23, 12, 1];arr2.sort(mysort);arr2.reverse();alert(arr2);
數(shù)組的一些操作方法:
concat創(chuàng)建一個(gè)新的副本,并合并傳進(jìn)來的參數(shù)
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創(chuàng)建一個(gè)新的副本,取數(shù)組的位置數(shù)據(jù)
var colors = ["red", "green", "blue", "yellow", "purple"];var colors2 = colors.slice(1);//從下標(biāo)為1的開始,到末尾var colors3 = colors.slice(1, 4);//從下標(biāo)1(包含1)到4(不包含4)alert(colors2); //green,blue,yellow,purplealert(colors3); //green,blue,yellow
splice會(huì)改變?cè)瓟?shù)組數(shù)據(jù),可實(shí)現(xiàn)對(duì)數(shù)組的刪、插和替換
var colors = ["red", "green", "blue"]; var removed = colors.splice(0, 1); // 刪除第一項(xiàng)(從下標(biāo)0開始,刪除1項(xiàng)) alert(colors); // green,blue alert(removed); // red,返回的數(shù)組中只包含一項(xiàng) removed = colors.splice(1, 0, "yellow", "orange"); // 從位置 1 開始插入兩項(xiàng)(從下標(biāo)0開始,刪除0項(xiàng),并插入后面的參數(shù)數(shù)據(jù)) alert(colors); // green,yellow,orange,blue alert(removed); // 返回的是一個(gè)空數(shù)組 removed = colors.splice(1, 1, "red", "purple"); // 插入兩項(xiàng),刪除一項(xiàng)(從下標(biāo)1開始,刪除1項(xiàng)[也就是yellow],并插入后面的參數(shù)數(shù)據(jù)) alert(colors); // green,red,purple,orange,blue alert(removed); // yellow,返回的數(shù)組中只包含一項(xiàng)
查找位置方法
indexOf()和 lastIndexOf(),就是查找在數(shù)組中的位置,和string中的對(duì)應(yīng)方法差不多。
迭代方法
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è)方法沒有返回值。
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ù)組中的包含的值。
如:
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區(qū)別不大,只是一個(gè)有返回值,一個(gè)沒有。實(shí)際中我們用forEach比較多,下面我們模擬forEach的實(shí)現(xiàn)。
var str = "", str2 = "";var numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];numbers.forEach(function (item, index, array) { str += item + "_";});//**************其實(shí)我們完全可以自己模擬實(shí)現(xiàn)*******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 + "_";});//**************其實(shí)我們完全可以自己模擬實(shí)現(xiàn)*******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(),這兩個(gè)方法是比較有意思的,以前還真沒接觸過。先看例子,再解釋:
var values = [1,2,3,4,5];var sum = values.reduce(function(prev, cur, index, array){ return prev + cur;});alert(sum); //15
也是個(gè)循環(huán),第一次執(zhí)行 prev 是 1, cur 是 2。第二次, prev 是 3(1 加 2 的結(jié)果), cur 是 3(數(shù)組的第三項(xiàng))。這個(gè)過程會(huì)持續(xù)到把數(shù)組中的每一項(xiàng)都訪問一遍,最后返回結(jié)果。reduceRight只是方向相反。
下面我們來模擬:
var numbers = [1, 2, 3, 4, 5, 3];var sum = numbers.reduce(function (prev, cur, index, array) { return prev + cur;});//***********************模擬實(shí)現(xiàn)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;});//***********************模擬實(shí)現(xiàn)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類型
我們很多時(shí)候需要測(cè)試一個(gè)函數(shù)的性能,可以取它的執(zhí)行進(jìn)過時(shí)間:
//取得開始時(shí)間var start = Date.now();//調(diào)用函數(shù)doSomething();//取得停止時(shí)間var stop = Date.now(),result = stop 主站蜘蛛池模板: 国产成人高清成人av片在线看 | 亚洲一区在线免费视频 | 成人 精品| 综合日韩av | av手机免费在线观看 | 欧美成人视 | 色人阁导航| 在线中文字幕亚洲 | 久久国产精品电影 | 啪啪激情| 久久久入口 | 亚洲电影在线播放 | 99在线热视频 | 日本不卡视频在线观看 | 免费一级欧美在线观看视频 | 日韩视频1| 黑人一区二区三区四区五区 | 日韩视频一区二区在线观看 | 黄色va视频 | 九九热这里只有精品8 | 久久久久久久91 | 国产一区二区精品91 | 国产亚洲精品久久久久5区 日韩一级片一区二区三区 国产精品久久久久av | 成人国产免费观看 | 欧洲成人一区 | 性欧美xxxx免费岛国不卡电影 | 亚洲视屏在线 | 久久国产精品一区 | av电影手机在线看 | 毛片免费视频播放 | 久久91久久久久麻豆精品 | www.9191.com| 激情夜色 | 毛片在线免费观看网址 | 黄色免费电影网址 | 91九色电影| 久久人操| 噜噜社| 久久精品视频12 | 国产精品久久久久久久久久iiiii | 日日狠狠久久偷偷四色综合免费 |