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

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 11:07:35
字體:
來源:轉載
供稿:網友

閱讀目錄

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再次動態自動累計。

棧方法、隊列方法:

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

從圖可以看出: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 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

欧美日本中文字幕| 欧美激情在线有限公司| 欧美精品久久久久久久免费观看| 精品国产乱码久久久久酒店| 在线观看欧美日韩| 久久九九精品99国产精品| 欧美精品制服第一页| 午夜精品福利视频| 日韩av一区在线| 日韩免费中文字幕| 久久大大胆人体| 亚洲欧美成人一区二区在线电影| 欧美电影电视剧在线观看| 日韩中文字幕免费| 91国产精品91| 日韩va亚洲va欧洲va国产| 色悠久久久久综合先锋影音下载| 中文字幕国内精品| 国产亚洲精品久久久久久| 亚洲欧美中文在线视频| 亚洲欧美日韩一区二区三区在线| 国产欧美中文字幕| 91美女片黄在线观看游戏| 国产日韩欧美中文在线播放| www.久久久久久.com| 91精品综合久久久久久五月天| 国产精品99久久久久久久久| 中文字幕久久精品| 亚洲欧美日韩成人| 欧美在线免费观看| 成人亚洲综合色就1024| 国产日韩欧美日韩大片| 欧美日韩在线免费| 久久精视频免费在线久久完整在线看| 精品国产一区二区三区四区在线观看| 日本sm极度另类视频| 亚洲国产欧美自拍| 亚洲日本欧美中文幕| 中文字幕亚洲无线码在线一区| 日韩精品免费综合视频在线播放| 国产成人久久久| 欧美精品在线网站| 欧美老女人在线视频| 97香蕉久久超级碰碰高清版| 国产精品美女在线观看| 成人国产精品一区二区| 粗暴蹂躏中文一区二区三区| 日韩av电影院| 欧美中文字幕第一页| 国产精品成人va在线观看| 中文字幕一区二区三区电影| 日韩中文字幕免费看| 91超碰中文字幕久久精品| 久久大大胆人体| 色综合天天狠天天透天天伊人| 精品亚洲一区二区三区四区五区| 亚洲剧情一区二区| 欧美一级片免费在线| 欧美丝袜美女中出在线| 亚洲大胆人体在线| 97成人精品区在线播放| 午夜精品久久久久久久男人的天堂| 中文日韩在线观看| 国产精品久久久久久久久久久久久| 亚洲国产成人av在线| 伊人成人开心激情综合网| 国产一区二区三区在线看| 成人网在线观看| 亚洲精品日韩av| 欧美日韩国产精品一区二区不卡中文| 国外成人在线视频| 91精品久久久久久久久久另类| 日韩精品在线视频美女| 亚洲天堂av在线播放| 日韩欧美有码在线| 国产日韩精品综合网站| 欧美韩国理论所午夜片917电影| 亚洲精品国产福利| 欧美激情一二三| 日韩欧美一区二区三区| 亚洲视频在线观看网站| 亚洲欧美在线免费观看| 国产精品久久久av久久久| 九九热r在线视频精品| 精品久久久一区二区| 免费av一区二区| 国产精品久久久久久一区二区| 国产精品久久久久久超碰| 国产欧美精品va在线观看| 亚洲国产日韩欧美在线动漫| 欧美成人精品在线观看| 奇米四色中文综合久久| 欧美精品免费在线| 欧美日韩国产专区| 日韩电视剧免费观看网站| 亚洲欧洲国产一区| 色青青草原桃花久久综合| 91视频国产精品| 国产视频久久久久久久| 久久免费视频在线观看| 亚洲最大福利视频网| 午夜精品久久久久久久久久久久久| 久久精品国产综合| 国产经典一区二区| 这里只有精品久久| 国产精品欧美日韩一区二区| 亚洲第一黄色网| 亚洲风情亚aⅴ在线发布| 国产成人涩涩涩视频在线观看| 久久精品91久久香蕉加勒比| 色天天综合狠狠色| 亚洲精品久久久久久久久久久| 亚洲日韩欧美视频一区| 欧美在线视频一区二区| 久久久最新网址| 一本色道久久88精品综合| 欧美人在线视频| 在线丨暗呦小u女国产精品| 精品国产依人香蕉在线精品| 91久久精品国产91久久性色| 久久久亚洲国产天美传媒修理工| 欧美亚洲国产成人精品| 国产日韩欧美日韩大片| 亚洲va久久久噜噜噜| 亚洲欧美国产日韩天堂区| 综合网日日天干夜夜久久| 久久久爽爽爽美女图片| 色偷偷综合社区| 国产成人亚洲综合| 亚洲美女av在线| 日韩中文在线视频| 日韩av高清不卡| 国产女人精品视频| 成人在线播放av| 亚洲综合视频1区| 精品久久久久国产| 久久91精品国产91久久跳| 成人免费观看a| 亚洲欧洲日本专区| 欧美高清视频在线播放| 欧洲亚洲免费视频| 亚洲精品第一国产综合精品| 亚洲欧美另类中文字幕| 91爱爱小视频k| 国产成人精彩在线视频九色| 国产成人精品av| 欧美激情一级二级| 国产精品亚洲激情| 欧美激情精品在线| 青青草99啪国产免费| 久久成人这里只有精品| 亚洲欧美一区二区三区情侣bbw| 456亚洲影院| 欧美日韩日本国产| 成人av在线网址| 青青a在线精品免费观看| 久久精品国产欧美激情| 国产成人一区二区三区电影| 久久久国产视频91| 欧美色另类天堂2015| 亚洲人成电影在线播放| 亚洲天天在线日亚洲洲精| 精品福利一区二区| 高跟丝袜欧美一区|