javascript引用類型之時間Date和數(shù)組Array
Javascript引用類型之時間Date
JavaScript中的Date類型是在早期Java中的java.util.Date類基礎(chǔ)上構(gòu)建的。為此,Date類型使用自UTC 1970年1月1日零時開始經(jīng)過的毫秒數(shù)來保存日期。在使用這種數(shù)據(jù)存儲格式的條件下,Date類型保存的日期能夠精確到1970年1月1日之前或之后的285 616年。
創(chuàng)建日期對象
在javascript中,可以使用Date()構(gòu)造函數(shù)來創(chuàng)建日期對象,如:
var date=new Date();
當(dāng)沒有向構(gòu)造函數(shù)傳遞日期參數(shù)時,將創(chuàng)建一個擁有當(dāng)前日期和時間的對象。
當(dāng)然,如果想根據(jù)特定的日期和時間創(chuàng)建日期對象,也是可以的,只需要將能表示日期的參數(shù)傳入構(gòu)造函數(shù)即可。
Date()構(gòu)造函數(shù)能夠接受的常用的日期格式有:
”月/日/年“,如2/27/2014;
”英文月名 日,年“,如February 27,2014;
”年,月,日,時,分,秒,毫秒“,如2014,1,27,11,22,22
下面分別以上面的格式來創(chuàng)建一個日期對象:
var date1=new Date("2/27/2014"); alert(date1); //Thu Feb 27 2014 00:00:00 GMT+0800 var date2=new Date("February 27,2014"); alert(date2); //Thu Feb 27 2014 00:00:00 GMT+0800 var date3=new Date(2014,1,27,11,24,0); alert(date3); //Thu Feb 27 2014 11:24:00 GMT+0800 var date4=new Date(2014,1,27); alert(date4); //Thu Feb 27 2014 00:00:00 GMT+0800 var date5=new Date("2014,1,27,11,24,0"); alert(date5); //Invalid Date
通過上面的例子,大家可能會注意到它們之間的區(qū)別:
第一,用前面兩種方式創(chuàng)建日期對象時,必須以字符串的形式作為參數(shù)傳入;而使用第三種方式創(chuàng)建時不能以字符串的形式傳入,每個值都得當(dāng)做單獨的值傳入。
第二,有一點必須特別注意,用第三種方式創(chuàng)建日期時,它的月份是從0開始的,即一月份對應(yīng)的是0,依次類推;而前面兩種方法,是正常的月份表示,即二月對應(yīng)的就是2。
第三,使用第三種方式表示時,年月是必須的,而其他參數(shù)省略時,將以0表示。
注:前面兩種方式與顯示的調(diào)用Date.parse()方法將得到一致的結(jié)果;第三種方式與顯示的調(diào)用Date.UTC()方法得到的結(jié)果一致。
繼承的方法
Date類型也繼承有toString()、toLocaleString()和valueOf()方法。調(diào)用這些方法所得到的值的格式會因為瀏覽器的不同而不同。具體的,自己可以嘗試調(diào)用下。
日期格式化方法
Date類型還有一些專門用于將日期格式化為字符串的方法,如下:
toDateString()——以特定與實現(xiàn)的格式顯示星期幾、月、日、年;
toTimeString()——以特定于實現(xiàn)的格式顯示時、分、秒、時區(qū);
toLocaleDateString()——以特定于地區(qū)的格式顯示星期幾、月、日、年;
toLocaleTimeString()——以特定于現(xiàn)實的格式顯示時、分、秒;
toUTCString()——以特定于顯示的格式顯示完整的UTC日期
上述方法可能相對不經(jīng)常使用,所以不深入介紹。
日期/時間組件方法
Javascript引用類型之?dāng)?shù)組Array
[數(shù)組的22種方法概述]
javaScript中的數(shù)組與其他多數(shù)語言中的數(shù)組有著相當(dāng)大的區(qū)別。雖然JavaScript數(shù)組與其他語言中的數(shù)組都是數(shù)據(jù)的有序列表,但與其他語言不同的是,JavaScript數(shù)組的每一項可以保持任何類型的數(shù)據(jù)。也就是說,可以用數(shù)組的第一個位置來保存字符串,用第二個位置來保存數(shù)值,用第三個位置來保存對象。而且,JavaScript數(shù)組的大小是可以動態(tài)調(diào)整的,即可以隨著數(shù)據(jù)的添加自動增長以容納新增數(shù)據(jù)。
Array:數(shù)組中的每一項可以保存任何類型的數(shù)據(jù),且數(shù)組的大小是動態(tài)調(diào)整的(最多可包含4294967295項,大約43億項)
[1.1]數(shù)組創(chuàng)建:
[1.1.1]使用Array構(gòu)造函數(shù)(在使用Array構(gòu)造函數(shù)時,也可以省略New操作符)
e.g. var colors = new Array(); var colors = new Array(20); var colors = new Array('red','blue','green'); var colors = Array(3);
[注意]若傳遞的是數(shù)值,則會按照該數(shù)值創(chuàng)建包含給定項數(shù)的數(shù)組;
如果傳遞的是其他類型的參數(shù),則會創(chuàng)建包含那個值的只有一項的數(shù)組
e.g. var colors = new Array(3);//包含三項的數(shù)組 var colors = new Array('Greg');//包含一項,且該項為"Greg"的數(shù)組
[1.1.2]使用數(shù)組字面量表示法(用該方法不會調(diào)用Array構(gòu)造函數(shù))
e.g. var colors = ['red','blue','green']; var colors = []; [不可用] var colors = [1,2,];
//在IE8及以前中會包含一個三個項目,且每個項目為1、2和undefined的數(shù)組。在其他瀏覽器中為只包含1和2的數(shù)組
[不可用] var colors = [,,,];
//在IE8及以前會創(chuàng)建4項的數(shù)組,而在其他瀏覽器中會創(chuàng)建3項的數(shù)組
[1.2]數(shù)組讀寫
[1.2.1]在讀取和設(shè)置數(shù)組的值時,要使用方括號并提供相應(yīng)值的基于0的數(shù)字索引,數(shù)組的項數(shù)保存在其length屬性中,這個屬性始終會返回0或更大的值
[1.2.2]數(shù)組的length屬性可讀可寫,通過設(shè)置數(shù)組的Length屬性,可以從數(shù)組的末尾移除項或向數(shù)組中添加新項
e.g. var colors = ['red','blue','green']; colors.length = 2; alert(colors[2]);//undefined colors.length = 4; alert(colors[3]);//undefined
[1.2.3]利用length屬性可以方便地在數(shù)組末尾添加新項
e.g. colors[colors.length] = 'black';
[1.2.4]當(dāng)把一個值放在超出數(shù)組大小的位置上時,數(shù)組就會重新計算其長度值,即長度值等于最后一項的索引加1
e.g. var colors = ['red','blue','green']; colors[99] = 'black'; alert(colors.length);//100
[1.3]數(shù)組檢測
[1.3.1]if(value instanceof Array){}:問題在于它假定只有一個全局執(zhí)行環(huán)境,如果網(wǎng)頁中包含多個框架,那實際上就存在兩個以上不同的全局環(huán)境,從而存在兩個以上不同版本的Array構(gòu)造函數(shù)。如果從一個框架向另一個框架傳入一個數(shù)組,那么傳入的數(shù)組與在第二個框架中原生創(chuàng)建的數(shù)組分別具有各自不同的構(gòu)造函數(shù)。
[1.3.2]ECMAScript5新增了Array.isArray()方法:if(Array.isArray(value)){}。該方法的目的是最終確定某個值到底是不是數(shù)組,而不管它在哪個全局環(huán)境中創(chuàng)建的
[1.4]數(shù)組轉(zhuǎn)換
[注意]如果數(shù)組中的某一項的值是null或者undefined,那么該值在join()、toLocaleString()、toString()和valueOf()方法返回的結(jié)果中以空字符串表示
[1.4.1]toString():返回由數(shù)組中每個值的字符串形式拼接而成的一個以逗號分隔的字符串
[1.4.2]valueof():返回的還是數(shù)組
e.g. var colors = ['red','blue','green']; console.log(colors.valueOf());//['red','blue','green'] alert(colors.valueOf());//'red,blue,green' alert(colors.toString());//'red,blue,green' alert(colors);//'red,blue,green'
[注意]由于alert()要接收字符串參數(shù),它會在后臺調(diào)用toString()方法,會得到與toString()方法相同的結(jié)果
[1.4.3]toLocaleString():它會創(chuàng)建一個數(shù)組值以逗號分隔的字符串,而每一項的值調(diào)用的是toLocaleString()方法
var person1 = { toLocaleString: function(){ return 'Nikolaos'; }, toString: function(){ return 'Nicholas'; } }; var person2 = { toLocaleString: function(){ return 'Grigorios'; }, toString: function(){ return 'Greg'; } }; var people = [person1,person2]; alert(people);//Nicholas,Greg alert(people.toString());//Nicholas,Greg alert(people.toLocaleString());//Nikolaos,Grigorios
[1.4.4]join:可以使用不同的分隔符來構(gòu)建這個字符串,join只接收一個字符,用作分隔符的字符串,然后返回包含所有數(shù)組項的字符串
e.g. var colors = ['red','green','blue']; alert(colors.join(','));//'red,green,blue' alert(colors.join('||'));//'red||green||blue' alert(colors.join());//'red,green,blue' alert(colors.join(undefined));//'red,green,blue'
[注意]在IE7及以前會使用undefined作為分隔符
[1.5]數(shù)組方法
[1.5.1]棧方法:棧是一種LIFO(last-in-first-out)后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),也就是最新添加的項最早被移除。棧中項的插入(叫做推入)和移除(叫做彈出)只發(fā)生在棧的頂部。
[1.5.1.1]push()方法:可以接收任意數(shù)量的參數(shù),把它們逐個添加到數(shù)組末尾,并返回修改后數(shù)組的長度。
[1.5.1.2]pop()方法:從數(shù)組末尾移除最后一項,減少數(shù)組的length值,然后返回移除的項。
[1.5.2]隊列方法:隊列是一種FIFO(first-in-first-out)先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),隊列在列表的末端添加項,從列表的前端移除項。
[1.5.2.1]shift():移除數(shù)組中的第一個項并返回該項,同時數(shù)組的長度減1(結(jié)合使用shift()和push()可以模擬隊列)
[1.5.2.2]unshift():在數(shù)組前端添加任意個項并返回新數(shù)組長度(結(jié)合使用unshift()和pop()從相反方向模擬隊列)
[注意]IE7及以下unshift()方法返回的總是undefined
[1.5.3]排序方法:
[1.5.3.1]reverse():反轉(zhuǎn)數(shù)組的順序,返回經(jīng)過排序之后的數(shù)組
[1.5.3.2]sort():按升序排列數(shù)組項,sort方法會調(diào)用每個數(shù)組項的toString()方法,然后比較得到的字符串排序,返回經(jīng)過排序之后的數(shù)組
[注意]sort()方法可以接受一個比較函數(shù)作為參數(shù),以便指定哪個值在哪個值的前面。比較函數(shù)接收兩個參數(shù),如果第一個參數(shù)應(yīng)該位于第二個參數(shù)之前則返回一個負(fù)數(shù),如果兩個參數(shù)相等則返回0,如果第一個參數(shù)應(yīng)該位于第二個參數(shù)之后則返回一個正數(shù)
[比較函數(shù)] (使用:e.g. array1.sort(compare);)
function compare(value1,value2){ if(value1 < value2){ return -1; }else if(value1 > value2){ return 1; }else{ return 0; } }
對于數(shù)值類型或valueOf()方法會返回數(shù)值類型的對象類型,比較函數(shù)可以簡化為:
function compare(value1,value2){ return value2 - value1; }
[tips]:常用以下方法來創(chuàng)建一個隨機(jī)數(shù)組
function compare(){ return Math.random() - 0.5; }
[1.5.4]操作方法(切開、連接、插入、刪除、替換):
[1.5.4.1]concat():基于當(dāng)前數(shù)組中的所有項創(chuàng)建一個新數(shù)組,先創(chuàng)建當(dāng)前數(shù)組一個副本,然后將接收到的參數(shù)添加到這個副本的末尾,最后返回新構(gòu)建的數(shù)組(concat()不影響原數(shù)組)
[注意1]沒有給concat()方法傳遞參數(shù)時,它只是復(fù)制當(dāng)前的數(shù)組
[注意2]如果參數(shù)是一個或多個數(shù)組,則該方法會將這些數(shù)組中的每一項都添加到結(jié)果數(shù)組中
[注意3]如果傳遞的值不是數(shù)組,這些值就會被簡單地添加到結(jié)果數(shù)組的末尾
e.g. var numbers = [1,2]; console.log(numbers.concat());//[1,2] console.log(numbers.concat([5,4,3],[3,4,5],1,2));//[1,2,5,4,3,3,4,5,1,2];
[1.5.4.2]slice():基于當(dāng)前數(shù)組中的一個或多個項創(chuàng)建一個新數(shù)組,接受一個或兩個參數(shù),即要返回項的起始和結(jié)束位置 ,最后返回新數(shù)組(slice()不影響原數(shù)組)
[注意1]沒有參數(shù)時,返回原數(shù)組
[注意2]只有一個參數(shù)時,slice()方法返回從該參數(shù)指定位置開始到當(dāng)前數(shù)組末尾的所有項
[注意3]兩個參數(shù)時,該方法返回起始位置和結(jié)束位置之間的項,但不包括結(jié)束位置的項
[注意4]若參數(shù)為負(fù)數(shù)時,則用數(shù)組長度加負(fù)數(shù)作為參數(shù)
[注意5]若結(jié)束位置小于開始位置,則返回空數(shù)組
var numbers = [1,2,3,4,5]; console.log(numbers.slice());//[1,2,3,4,5] console.log(numbers.slice(2));//[3,4,5] console.log(numbers.slice(2,3));//[3] console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5] console.log(numbers.slice(2,1));//[]
[1.5.4.3]splice():原數(shù)組變?yōu)樾薷暮蟮臄?shù)組,而splice()返回從原數(shù)組中刪除的項組成的數(shù)組,若無刪除項則返回空數(shù)組
[a]刪除:兩個參數(shù)為要刪除的第一項的位置、要刪除的項數(shù)
[b]插入:三個參數(shù)為起始位置、0(要刪除的基數(shù))、要插入的項
[c]替換:三個參數(shù)為起始位置、要刪除的項數(shù)、要插入的項
[注意1]若第一個參數(shù)為負(fù)數(shù)時,則用數(shù)組長度加負(fù)數(shù)作為參數(shù)
[注意2]若第二個參數(shù)為負(fù)數(shù)時,則用0作為參數(shù)
var numbers = [1,2,3,4,5]; console.log(numbers.splice(0,2),numbers);//[1,2] [3,4,5] var numbers = [1,2,3,4,5]; console.log(numbers.splice(1,0,11,12),numbers);//[] [1,11,12,2,3,4,5] var numbers = [1,2,3,4,5]; console.log(numbers.splice(1,3,11,12),numbers);//[2,3,4] [1,11,12,5] var numbers = [1,2,3,4,5]; console.log(numbers.splice(-4,3,11,12),numbers);//-4+5=1 -> [2,3,4] [1,11,12,5] var numbers = [1,2,3,4,5]; console.log(numbers.splice(-4,-3,11,12),numbers);//-4+5=1 -> [] [1,11,12,2,3,4,5]
[1.5.5]位置方法(ECMAScript5):兩個參數(shù):要查找的項、表示查找起點位置的索引(可選)。返回第一個滿足條件的查找項在數(shù)組中的位置,如果沒有找到則返回-1(位置方法不會影響原數(shù)組)
[注意]在比較時,使用全等操作符
[1.5.5.1]indexOf()
[1.5.5.2]lastIndexOf()
var person = {name: 'Nicholas'}; var people = [{name: 'Nicholas'}]; var morePeople = [person]; alert(people.indexOf(person));//-1,因為person和people[0]雖然值相同,但是是兩個引用 alert(morePeople.indexOf(person));//0,因為person和morepeople[0]是同一個引用 alert(morePeople.indexOf({name: 'Nicholas'}));//-1,因為不是同一個引用
[tips]若返回滿足條件的項的所有索引值
function allIndexOf(array,value){ var result = []; var pos = array.indexOf(value); if(pos === -1){ return -1; } while(pos > -1){ result.push(pos); pos = array.indexOf(value,pos+1); } return result; } var array = [1,2,3,3,2,1]; console.log(allIndexOf(array,1));//[0,5]
[1.5.6]迭代方法(ECMAScript5):兩個參數(shù):要在每一項上運行的函數(shù)、運行該函數(shù)作用域?qū)ο蟆绊憈his的值(可選)。傳入這些方法中的函數(shù)會接收三個參數(shù):數(shù)組項的值、該項在數(shù)組中的位置、數(shù)組對象本身(迭代方法不會影響原數(shù)組)
[1.5.6.1]every():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對每一項都返回true,則返回true
[1.5.6.2]filter():對數(shù)組中的每一項運行給定函數(shù),返回該函數(shù)會返回true的項組成的數(shù)組(常用于查詢符合條件的所有數(shù)組項)
[1.5.6.3]forEach():對數(shù)組中的每一項運行給定函數(shù),這個方法沒有返回值(相當(dāng)于for循環(huán))
[1.5.6.4]map():對數(shù)組中的每一項運行給定函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組(常用于創(chuàng)建包含項與另一個數(shù)組一一對應(yīng)的數(shù)組)
[1.5.6.5]some():對數(shù)組中的每一項運行給定函數(shù),如果該函數(shù)對任一項返回true,則返回true
var numbers = [1,2,3,4,5,6,7,8,9,0]; var sum = 0; var everyResult = numbers.every(function(item,index,array){ return (item>2); }); var filterResult = numbers.filter(function(item,index,array){ return (item>2) }); var forEachResult = numbers.forEach(function(item,index,array){ sum += item; return (item>2) }); var mapResult = numbers.map(function(item,index,array){ return (item*2) }); var som = numbers.some(function(item,index,array){ return (item>2) }); console.log(everyResult);//false console.log(filterResult);//[3,4,5,6,7,8,9] console.log(forEachResult,sum);//undefined 45 console.log(mapResult);//[2,4,6,8,10,12,14,16,18,0] console.log(someResult);//true [tips] function logArray(value,index,array){ console.log(value); } [2,5,,,,,9].forEach(logArray)//2 5 9
[1.5.7]歸并方法(ECMAScript5):迭代數(shù)組的所有項,構(gòu)建一個最終返回的值。接收兩個參數(shù):一個在每一項上調(diào)用的函數(shù)、作為歸并基礎(chǔ)的初始值(可選)。傳給reduce()和reduceRight()的函數(shù)接受4個參數(shù):前一個值、當(dāng)前值、項的索引和數(shù)組對象。這個函數(shù)返回的任何值都會作為第一個參數(shù)自動傳給下一項。第一次迭代發(fā)生在數(shù)組的第二項上。因此,第一個參數(shù)是數(shù)組第一項,第二個參數(shù)是數(shù)組第二項(歸并方法不會影響原數(shù)組)
[1.5.7.1]reduce()
[1.5.7.2]reduceRight()
var sum = values.reduce(function(prev,cur,index,array){ return prev+cur; }) alert(sum);//15
相關(guān)文章
JS字符串分割方法整理匯總示例講解(3種截取方法和6個輔助方法)
JavaScript在開發(fā)中常常會需要截取字符串,而JS提供了slice()?、substring()、substr()?3種方法實現(xiàn)截取操作。另外還有字符串相關(guān)的6種輔助方法:indexOf()、lastIndexOf()、split()、join()、concat()、charAt()?。2023-02-02JavaScript數(shù)據(jù)類型學(xué)習(xí)筆記分享
這篇文章主要為大家分享了JavaScript數(shù)據(jù)類型學(xué)習(xí)筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09