Math對(duì)象
Math
Math對(duì)象是JavaScript的內(nèi)置對(duì)象芯杀,提供一系列數(shù)學(xué)常數(shù)和數(shù)學(xué)方法怕犁。Math對(duì)象只提供了靜態(tài)的屬性和方法扣甲,所以使用時(shí)不用實(shí)例化
也就是說(shuō),不用像創(chuàng)建字符串和數(shù)組那樣需要new一個(gè)實(shí)例出來(lái)
屬性
Math對(duì)象提供以下一些只讀的數(shù)學(xué)常數(shù)币砂。
Math.E // 2.718281828459045
Math.LN2 // 0.6931471805599453
Math.LN10 // 2.302585092994046
Math.LOG2E // 1.4426950408889634
Math.LOG10E // 0.4342944819032518
Math.PI // 3.141592653589793
Math.SQRT1_2 // 0.7071067811865476
Math.SQRT2 // 1.4142135623730951
方法
- round
round方法用于四舍五入
Math.round(0.1) // 0
Math.round(0.5) // 1
它對(duì)于負(fù)值的運(yùn)算結(jié)果與正值略有不同建峭,主要體現(xiàn)在對(duì).5的處理
Math.round(-1.1) // -1
Math.round(-1.5) // -1
Math.round(-0.6)// -1
- abs,max决摧,min
abs方法返回參數(shù)值的絕對(duì)值
Math.abs(1) // 1
Math.abs(-1) // 1
max方法返回最大的參數(shù)亿蒸,min方法返回最小的參數(shù)
Math.max(2, -1, 5) // 5
Math.min(2, -1, 5) // -1
- floor凑兰,ceil
floor方法返回小于參數(shù)值的最大整數(shù)
Math.floor(3.2) // 3
Math.floor(-3.2) // -4
ceil方法返回大于參數(shù)值的最小整數(shù)
Math.ceil(3.2) // 4
Math.ceil(-3.2) // -3
- pow,sqrt
pow方法返回以第一個(gè)參數(shù)為底數(shù)边锁、第二個(gè)參數(shù)為冪的指數(shù)值
Math.pow(2, 2) // 4
Math.pow(2, 3) // 8
sqrt方法返回參數(shù)值的平方根姑食。如果參數(shù)是一個(gè)負(fù)值,則返回NaN
Math.sqrt(4) // 2
Math.sqrt(-4) // NaN
- log茅坛,exp
log方法返回以e為底的自然對(duì)數(shù)值
Math.log(Math.E) // 1
Math.log(10) // 2.302585092994046
求以10為底的對(duì)數(shù)音半,可以除以Math.LN10;求以2為底的對(duì)數(shù)贡蓖,可以除以Math.LN2曹鸠。
Math.log(100)/Math.LN10 // 2
Math.log(8)/Math.LN2 // 3
exp方法返回常數(shù)e的參數(shù)次方
Math.exp(1) // 2.718281828459045
Math.exp(3) // 20.085536923187668
random
該方法返回0到1之間的一個(gè)偽隨機(jī)數(shù),可能等于0摩梧,但是一定小于1
Math.random() // 0.7151307314634323
// 返回給定范圍內(nèi)的隨機(jī)數(shù)
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
// 返回給定范圍內(nèi)的隨機(jī)整數(shù)
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
-
返回范圍內(nèi)隨機(jī)數(shù)
random隨機(jī)數(shù) -
獲取隨機(jī)字符串
獲取隨機(jī)字符串 -
獲取隨機(jī)IP
隨機(jī)IP
隨機(jī)IP改進(jìn) -
隨機(jī)結(jié)果
隨機(jī)結(jié)果
說(shuō)明:這可套用為不同用戶登錄網(wǎng)站時(shí)物延,隨機(jī)產(chǎn)生不同的效果
join: arrayObject.join(separator)宣旱。返回一個(gè)字符串仅父。該字符串是通過(guò)把 arrayObject 的每個(gè)元素轉(zhuǎn)換為字符串,然后把這些字符串連接起來(lái)浑吟,在兩個(gè)元素之間插入 separator 字符串而生成的笙纤。
- 三角函數(shù)
sin方法返回參數(shù)的正弦,cos方法返回參數(shù)的余弦组力,tan方法返回參數(shù)的正切省容。
Math.sin(0) // 0
Math.cos(0) // 1
Math.tan(0) // 0
asin方法返回參數(shù)的反正弦,acos方法返回參數(shù)的反余弦燎字,atan方法返回參數(shù)的反正切腥椒。這三個(gè)方法的返回值都是弧度值。
Math.asin(1) // 1.5707963267948966
Math.acos(1) // 0
Math.atan(1) // 0.7853981633974483
數(shù)組
基本使用
var arr = [3, 4, 5, 6]
console.log(arr.length) //4
console.log(arr[0]) //3
console.log(arr[3]) //6
console.log(arr[4]) //undefined
arr[4] = 'hello'
console.log(arr[4]) // 'hello'
arr.push('jirengu') //再數(shù)組最后添加一個(gè)元素
console.log(arr) // [3, 4, 5, 6, 'hello', 'jirengu']
var value = arr.pop() //把數(shù)組最后一位彈出來(lái)候衍,返回
console.log(value) //'jirengu'
console.log(arr) //[3, 4, 5, 6, 'hello']
arr.unshift('ruoyu') //在數(shù)組第一位新增
console.log(arr) //['ruoyu', 3, 4, 5, 6, 'hello']
var value2 = arr.shift() //把數(shù)組第一位拿出來(lái)返回笼蛛,數(shù)組發(fā)生變化
console.log(value2) // 'ruoyu'
console.log(arr) //[3, 4, 5, 6, 'hello']
var arr2 = arr.splice(1, 2) //從下標(biāo)為1的元素開(kāi)始,拿出來(lái)2個(gè)元素作為一個(gè)數(shù)組返回蛉鹿,原數(shù)組發(fā)生改變
console.log(arr) // [3, 6, 'hello']
console.log(arr2) // [4, 5]
arr.splice(1, 0, 8,9) //從下標(biāo)為1的位置(元素6)開(kāi)始滨砍,刪除0個(gè),新增兩個(gè)元素(在6前面新增8,9)
console.log(arr) //[3, 8, 9, 6, 'hello']
var arr3 = arr.slice(2,3) //從 arr 下標(biāo)為2開(kāi)始妖异,到下標(biāo)為3結(jié)束(不包括3)惋戏,做為新數(shù)組,原數(shù)組不變
console.log(arr3) // [9]
console.log(arr) //[3, 8, 9, 6, 'hello']
var str = arr.join('-')
console.log(str) // "3-8-9-6-hello"
var arr4 = [3, 5, -1, 18, 9, 27]
arr4.reverse() //倒序他膳,本身發(fā)生變化
arr4.sort(function(v1, v2){ //排序响逢,本身發(fā)生變化
return v1-v2; //v2-v1
})
字面量
不使用new來(lái)創(chuàng)建一個(gè)函數(shù)的實(shí)例,直接使用相應(yīng)的符號(hào)來(lái)創(chuàng)建相應(yīng)的實(shí)例棕孙,這些符號(hào)也就是對(duì)應(yīng)的字面量表示龄句,例如回论,創(chuàng)建數(shù)組,應(yīng)該寫(xiě)為
var a = new Array(1, 2, 3)
使用字面量表示的話分歇,就是
var a = [1, 2, 3] //這里的中括號(hào)即為數(shù)組的字面量
類似的傀蓉,對(duì)于對(duì)象,{}也是一樣的意思职抡,即為對(duì)象的字面量表示
var b = [1, 2, 'hello'];
但是使用字面量方式葬燎,無(wú)論傳入幾個(gè)參數(shù),都會(huì)把參數(shù)當(dāng)作初始化內(nèi)容
var a1 = [5];
console.log(a1.length);//1
console.log(a1); //[5]
var a2 = [5,6];
console.log(a2.length);//2
console.log(a2); //[5,6]
使用帶初始化參數(shù)的方式創(chuàng)建數(shù)組的時(shí)候缚甩,最好最后不要帶多余的”,”谱净,在不同的瀏覽器下對(duì)此處理方式不一樣
var a1 = [1,2,3,];
console.log(a1.length);
console.log(a1);
這段腳本在現(xiàn)代瀏覽器上運(yùn)行結(jié)果和我們?cè)O(shè)想一樣,長(zhǎng)度是3擅威,但是在低版本IE下確實(shí)長(zhǎng)度為4的數(shù)組壕探,最后一條數(shù)據(jù)是undefined
創(chuàng)建數(shù)組
在JavaScript多種方式創(chuàng)建數(shù)組
構(gòu)造函數(shù)
在使用構(gòu)造函數(shù)創(chuàng)建數(shù)組時(shí)如果傳入一個(gè)數(shù)字參數(shù),則會(huì)創(chuàng)建一個(gè)長(zhǎng)度為參數(shù)的數(shù)組郊丛,如果傳入多個(gè)李请,則創(chuàng)建一個(gè)數(shù)組,參數(shù)作為初始化數(shù)據(jù)加到數(shù)組中
var a1 = new Array(5);
console.log(a1.length);//5
console.log(a1); //[] ,數(shù)組是空的
var a2 = new Array(5,6);
console.log(a2.length);//2
console.log(a2); //[5,6]
數(shù)組的索引與長(zhǎng)度
數(shù)組的值可以通過(guò)自然數(shù)索引訪問(wèn)進(jìn)行讀寫(xiě)操作厉熟,下標(biāo)也可以是一個(gè)得出非負(fù)整數(shù)的變量或表達(dá)式
var a1 = [1,2,3,4];
console.log(a1[0]); //1
var i=1;
console.log(a1[i]); //2 使用變量作為下標(biāo)
console.log(a1[++i]); //3 使用表達(dá)式作為下標(biāo)
數(shù)組也是對(duì)象导盅,我們可以使用索引的奧秘在于,數(shù)組會(huì)把索引值轉(zhuǎn)換為對(duì)應(yīng)字符串(1=>”1”)作為對(duì)象屬性名
console.log(1 in a1);//true揍瑟,確實(shí)是一個(gè)屬性
說(shuō)明:圖中的1 in a判斷a中是否有1這個(gè)索引
索引特殊性在于數(shù)組會(huì)自動(dòng)更新length屬性白翻,當(dāng)然因?yàn)镴avaScript語(yǔ)法規(guī)定數(shù)字不能作為變量名,所以我們不能顯式使用array.1這樣的格式绢片。由此可見(jiàn)其實(shí)負(fù)數(shù)滤馍,甚至非數(shù)字”索引“都是允許的,只不過(guò)這些會(huì)變成數(shù)組的屬性底循,而不是索引
var a = [1, 2, 3];
a[-10]="a[-10]";
a["sss"]="sss";
這樣我們可以看出所有的索引都是屬性名巢株,但只有自然數(shù)(有最大值)才是索引,一般我們?cè)谑褂脭?shù)組的時(shí)候不會(huì)出現(xiàn)數(shù)組越界錯(cuò)誤也正是因?yàn)榇舜说瑪?shù)組的索引可以不是連續(xù)的纯续,訪問(wèn)index不存在的元素的時(shí)候返回undefined
var a = new Array(1,2,3);
a[100] = 100;
console.log(a.length); //101
console.log(a[3]); //undefined
console.log(a[99]); //undefined
console.log(a[100]); 100
上面的例子中,雖然直接對(duì)a[100]賦值不會(huì)影響a[4]或a[99],但數(shù)組的長(zhǎng)度卻受到影響灭袁,數(shù)組length屬性等于數(shù)組中最大的index+1猬错,我們知道數(shù)組的length屬性同樣是個(gè)可寫(xiě)的屬性,當(dāng)強(qiáng)制把數(shù)組的length屬性值設(shè)置為小于等于最大index值時(shí)茸歧,數(shù)組會(huì)自動(dòng)刪除indexd大于等于length的數(shù)據(jù)倦炒,在剛才代碼中追加幾句
a.length = 2
console.log(a);//[1,2]
這時(shí)候會(huì)發(fā)現(xiàn)a[2]和a[100]被自動(dòng)刪除了,同理软瞎,如果把length設(shè)置為大于最大index+1的值的時(shí)候逢唤,數(shù)組也會(huì)自動(dòng)擴(kuò)張拉讯,但是不會(huì)為數(shù)組添加新元素,只是在尾部追加空空間
a.length=5;
console.log(a); //[1,2] //后面沒(méi)有3個(gè)undefined
元素添加/刪除
基本方法
上面例子已經(jīng)用到向數(shù)組內(nèi)添加元素方法鳖藕,直接使用索引就可以(index沒(méi)必要連續(xù))
var a=new Array(1,2,3);
a[3]=4;
console.log(a);//[1, 2, 3, 4]
前面提到數(shù)組也是對(duì)象魔慷,索引只是特殊的屬性,所以我們可以使用刪除對(duì)象屬性的方法,使用delete 刪除數(shù)組元素
delete a[2];
console.log(a[2]); //undefined
這樣和直接把a(bǔ)[2]賦值為undefined類似著恩,不會(huì)改變數(shù)組長(zhǎng)度院尔,也不會(huì)改變其他數(shù)據(jù)的index和value對(duì)應(yīng)關(guān)系
棧方法
上面例子總有同學(xué)就發(fā)現(xiàn)了,尤其是其刪除方法喉誊,并不是我們希望的表現(xiàn)形式邀摆,我們很多時(shí)候希望刪除中間一個(gè)元素后,后面元素的index都自動(dòng)減一伍茄,數(shù)組length同時(shí)減一栋盹,就好像在一個(gè)堆棧中拿去的一個(gè),數(shù)組已經(jīng)幫我們做好了這種操作方式敷矫,pop
和push
能夠讓我們使用堆棧那樣先入后出使用數(shù)組
var a = new Array(1,2,3);
a.push(4);
console.log(a);//[1, 2, 3, 4]
console.log(a.length);//4
console.log(a.pop());//4
console.log(a); //[1, 2, 3]
console.log(a.length);//3
隊(duì)列方法
既然棧方法都實(shí)現(xiàn)了例获,先入先出的隊(duì)列怎么能少,shift
方法可以刪除數(shù)組index最小元素沪饺,并使后面元素index都減一躏敢,length也減一闷愤,這樣使用shift/push就可以模擬隊(duì)列了整葡,當(dāng)然與shift方法對(duì)應(yīng)的有一個(gè)unshift
方法,用于向數(shù)組頭部添加一個(gè)元素
var a=new Array(1,2,3);
a.unshift(4);
console.log(a);//[4, 1, 2, 3]
console.log(a.length);//4
console.log(a.shift());//4
console.log(a); //[1, 2, 3]
console.log(a.length);//3
終極神器
JavaScript提供了一個(gè)splice
方法用于一次性解決數(shù)組添加讥脐、刪除(這兩種方法一結(jié)合就可以達(dá)到替換效果)遭居,方法有三個(gè)參數(shù)
1.開(kāi)始索引
2.刪除元素的位移
3.插入的新元素,當(dāng)然也可以寫(xiě)多個(gè)
splice方法返回一個(gè)由刪除元素組成的新數(shù)組旬渠,沒(méi)有刪除則返回空數(shù)組
var a = new Array(1,2,3,4,5);
刪除
指定前兩個(gè)參數(shù)俱萍,可以使用splice刪除數(shù)組元素,同樣會(huì)帶來(lái)索引調(diào)整及l(fā)ength調(diào)整
var a = new Array(1,2,3,4,5);
console.log(a.splice(1,3));//[2, 3, 4]
console.log(a.length);//2
console.log(a);//[1,5]
如果數(shù)組索引不是從0開(kāi)始的告丢,那么結(jié)果會(huì)很有意思枪蘑,有一這樣數(shù)組
var a = new Array();
a[2]=2;
a[3]=3;
a[7]=4;
a[8]=5;
console.log(a.splice(3,4)); //[3]
console.log(a.length); //5
console.log(a); //[2: 2, 3: 4, 4: 5]
上面例子可以看到,splice的第一個(gè)參數(shù)是絕對(duì)索引值岖免,而不是相對(duì)于數(shù)組索引岳颇,第二個(gè)參數(shù)并不是刪除元素的個(gè)數(shù),而是刪除動(dòng)作執(zhí)行多少次颅湘,并不是按數(shù)組實(shí)際索引移動(dòng)话侧,而是連續(xù)移動(dòng)。同時(shí)調(diào)整后面元素索引闯参,前面索引不理會(huì)
插入與替換
只要方法第二個(gè)參數(shù)無(wú)瞻鹏,也就是刪除動(dòng)作執(zhí)行的次數(shù)設(shè)為0悲立,第三個(gè)參數(shù)及以后填寫(xiě)要插入內(nèi)容就splice就能執(zhí)行插入操作,而如果第二個(gè)參數(shù)不為0則變成了先在該位置刪除再插入新博,也就是替換效果
var a = [1,2,3,4,5];
a.splice(1,0,9,99,999);
console.log(a.length); //8
console.log(a);//[1, 9, 99, 999, 2, 3, 4, 5]
a.splice(1,3,8,88,888);
console.log(a.length);//8
console.log(a);//[1, 8, 88, 888, 2, 3, 4, 5]
常用操作
join(char)
這個(gè)方法在C#等語(yǔ)言中也有薪夕,作用是把數(shù)組元素(對(duì)象調(diào)用其toString()方法)使用參數(shù)作為連接符連接成一字符串,不會(huì)修改原數(shù)組內(nèi)容
var a = [1,2,3,4,5];
console.log(a.join(',')); //1,2,3,4,5
console.log(a.join(' ')); //1 2 3 4 5
slice(start,end)
不要和splice方法混淆赫悄,slice方法用于返回?cái)?shù)組中一個(gè)片段或子數(shù)組寥殖,如果只寫(xiě)一個(gè)參數(shù)返回參數(shù)到數(shù)組結(jié)束部分,如果參數(shù)出現(xiàn)負(fù)數(shù)涩蜘,則從數(shù)組尾部計(jì)數(shù)(-3意思是數(shù)組倒第三個(gè)嚼贡,一般人不會(huì)這么干,但是在不知道數(shù)組長(zhǎng)度同诫,想舍棄后n個(gè)的時(shí)候有些用粤策,不過(guò)數(shù)組長(zhǎng)度很好知道。误窖。叮盘。。霹俺,好糾結(jié)的用法)柔吼,如果start大于end返回空數(shù)組,值得注意的一點(diǎn)是slice不會(huì)改變?cè)瓟?shù)組丙唧,而是返回一個(gè)新的數(shù)組
var a = [1,2,3,4,5];
console.log(a); //[1, 2, 3, 4, 5]
console.log(a.slice(1,2));//2
console.log(a.slice(1,-1));//[2, 3, 4]
console.log(a.slice(3,2));//[]
console.log(a); //[1, 2, 3, 4, 5]
concat(array)
看起來(lái)像是剪切愈魏,但這個(gè)真不是形聲字,concat方法用于拼接數(shù)組想际,a.concat(b)返回一個(gè)a和b共同組成的新數(shù)組培漏,同樣不會(huì)修改任何一個(gè)原始數(shù)組,也不會(huì)遞歸連接數(shù)組內(nèi)部數(shù)組
var a = [1,2,3,4,5];
var b = [6,7,8,9];
console.log(a.concat(b));//[1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(a); //[1, 2, 3, 4, 5]
console.log(b); //[6, 7, 8, 9]
reverse()
方法用于將數(shù)組逆序胡本,與之前不同的是它會(huì)修改原數(shù)組
var a = [1,2,3,4,5];
a.reverse();
console.log(a); //[5, 4, 3, 2, 1]
同樣牌柄,當(dāng)數(shù)組索引不是連續(xù)或以0開(kāi)始,結(jié)果需要注意
var a = new Array();
a[2]=2;
a[3]=3;
a[7]=4;
a[8]=5;
a.reverse();
sort
sort方法用于對(duì)數(shù)組進(jìn)行排序侧甫,當(dāng)沒(méi)有參數(shù)的時(shí)候會(huì)按字母表升序排序珊佣,如果含有undefined會(huì)被排到最后面,對(duì)象元素則會(huì)調(diào)用其toString方法披粟,如果想按照自己定義方式排序咒锻,可以傳一個(gè)排序方法進(jìn)去,很典型的策略模式僻爽,同樣sort會(huì)改變?cè)瓟?shù)組虫碉。
var a=[5,4,3,2,1];
a.sort();
console.log(a);//[1, 2, 3, 4, 5]
但是。胸梆。敦捧。
var a=[7,8,9,10,11];
a.sort();
console.log(a);//[10, 11, 7, 8, 9]
因?yàn)榘凑兆帜副恚ˋCSII碼表)排序须板,7就比10大了,這時(shí)候我們需要傳入自定義排序函數(shù)
var a = [7,8,9,10,11];
a.sort(function(v1,v2){
return v1-v2;
});
console.log(a);//[7, 8, 9, 10, 11]
sort內(nèi)部使用快速排序兢卵,每次比較兩個(gè)元素大小的時(shí)候如果沒(méi)有參數(shù)习瑰,則直接判斷字母表,如果有參數(shù)秽荤,則把正在比較的兩個(gè)參數(shù)傳入自定義方法并調(diào)用(正在比較的兩個(gè)數(shù)會(huì)傳給自定義方法的v1甜奄、v2),如果返回值大于0表示v1 > v2
窃款,如果等于0课兄,表示v1 = v2
,如果小于0晨继,表示v1 < v2
烟阐,其實(shí)我們傳入的方法就是告訴sort怎么比較兩個(gè)元素誰(shuí)大誰(shuí)小,至于排序移動(dòng)元素過(guò)程人家寫(xiě)好了
Date
Date對(duì)象是JavaScript提供的日期和時(shí)間的操作接口
Date對(duì)象有幾個(gè)靜態(tài)方法
Date.now()
now方法返回當(dāng)前距離1970年1月1日00:00:00的毫秒數(shù)
Date.now(); // 1427974222853
Date.parse()
parse方法用來(lái)解析日期字符串紊扬,返回距離1970年1月1日 00:00:00的毫秒數(shù)
日期字符串的格式應(yīng)該完全或者部分符合YYYY-MM-DDTHH:mm:ss.sssZ格式蜒茄,Z表示時(shí)區(qū),是可選的
如果解析失敗餐屎,返回NaN
Date.parse("January 26, 2011 13:51:50")
Date.parse("Mon, 25 Dec 1995 13:30:00 GMT")
Date.parse("Mon, 25 Dec 1995 13:30:00 +0430")
Date.parse("2011-10-10")
Date.parse("2011-10-10T14:48:00")
Date.UTC()
默認(rèn)情況下檀葛,Date對(duì)象返回的都是當(dāng)前時(shí)區(qū)的時(shí)間
Date.UTC方法可以返回UTC時(shí)間。該方法接受年腹缩、月屿聋、日等變量作為參數(shù),返回當(dāng)前距離1970年1月1日 00:00:00 UTC的毫秒數(shù)
Date.UTC(2015,0,1,2,3,4,567); //1420077784567
Date()
Date函數(shù)可以直接調(diào)用庆聘,返回一個(gè)當(dāng)前日期和時(shí)間的字符串胜臊,這時(shí)候是否有參數(shù)結(jié)果一樣
Date(); // "Thu Apr 02 2015 19:20:29 GMT+0800 (CST)"
new Date()
使用Date構(gòu)造函數(shù)創(chuàng)建一個(gè)Date的實(shí)例
new Date();
實(shí)例時(shí)間為當(dāng)前時(shí)間勺卢,同時(shí)實(shí)例有些方法
get
Date.prototype.getTime():返回實(shí)例對(duì)象距離1970年1月1日00:00:00對(duì)應(yīng)的毫秒數(shù)伙判,等同于valueOf方法
Date.prototype.getDate():返回實(shí)例對(duì)象對(duì)應(yīng)每個(gè)月的幾號(hào)(從1開(kāi)始)
Date.prototype.getDay():返回星期,星期日為0黑忱,星期一為1宴抚,以此類推
Date.prototype.getFullYear():返回四位的年份
Date.prototype.getMonth():返回月份(0表示1月,11表示12月)
Date.prototype.getHours():返回小時(shí)(0-23)
Date.prototype.getMilliseconds():返回毫秒(0-999)
Date.prototype.getMinutes():返回分鐘(0-59)
Date.prototype.getSeconds():返回秒(0-59)
Date.prototype.getTimezoneOffset():返回當(dāng)前時(shí)間與UTC的時(shí)區(qū)差異甫煞,以分鐘表示菇曲,返回結(jié)果考慮到了夏令時(shí)因素
set
Date.prototype.setDate(date):設(shè)置實(shí)例對(duì)象對(duì)應(yīng)的每個(gè)月的幾號(hào)(1-31),返回改變后毫秒時(shí)間戳
-
Date.prototype.setFullYear(year [, month, date]):設(shè)置四位年份
setFullYear實(shí)例 Date.prototype.setHours(hour [, min, sec, ms]):設(shè)置小時(shí)(0-23)
Date.prototype.setMilliseconds():設(shè)置毫秒(0-999)
Date.prototype.setMinutes(min [, sec, ms]):設(shè)置分鐘(0-59)
Date.prototype.setMonth(month [, date]):設(shè)置月份(0-11)
Date.prototype.setSeconds(sec [, ms]):設(shè)置秒(0-59)
Date.prototype.setTime(milliseconds):設(shè)置毫秒時(shí)間戳
Date.prototype.toString()
toString方法返回一個(gè)完整的時(shí)間字符串
var today = new Date();
today.toString(); // "Fri Apr 03 2015 11:17:29 GMT+0800 (CST)"
說(shuō)明:此方法可用于存儲(chǔ)時(shí)間抚吠,當(dāng)我們存儲(chǔ)數(shù)據(jù)到數(shù)據(jù)庫(kù)的時(shí)候常潮,存儲(chǔ)的是字符串,一方面可以將毫秒數(shù)存起來(lái)楷力,另一方面可以將時(shí)間轉(zhuǎn)換為字符串存儲(chǔ)喊式,然后獲取的時(shí)候還原為時(shí)間對(duì)象
-
+號(hào)調(diào)用valueof返回date對(duì)象毫秒數(shù)
圖例
說(shuō)明:三種方式返回時(shí)間對(duì)象毫秒數(shù)
1.Date.getTime() //時(shí)間對(duì)象都行
2.+new Date() //時(shí)間對(duì)象都行
3.Date.now() //返回當(dāng)前時(shí)間的時(shí)間戳孵户,其他時(shí)間對(duì)象不行
Date.prototype.toUTCString(),Date.prototype.toISOString()
toUTCString方法返回對(duì)應(yīng)的UTC時(shí)間岔留,也就是比北京時(shí)間晚8個(gè)小時(shí)夏哭。toISOString方法返回對(duì)應(yīng)時(shí)間的ISO8601寫(xiě)法。
var today = new Date(1362790014000);
today.toUTCString(); //
today.toISOString(); //
Date.prototype.toDateString()献联,Date.prototype.toTimeString()
toDateString方法返回日期的字符串形式竖配,toTimeString方法返回時(shí)間的字符串形式。
var today = new Date(1362790014000);
today.toDateString(); // "Fri Apr 03 2015"
today.toTimeString(); // "11:17:29 GMT+0800 (CST)"
toLocalDateString, toLocalTimeString
toLocalDateString方法返回一個(gè)字符串里逆,代表日期的當(dāng)?shù)貙?xiě)法
toLocalTimeString方法返回一個(gè)字符串进胯,代表時(shí)間的當(dāng)?shù)貙?xiě)法
var today = new Date(1362790014000);
today.toLocaleDateString(); // "2015/4/3"
today.toLocaleTimeString(); // "上午11:17:29"
new Date(milliseconds)
Date對(duì)象接受從1970年1月1日00:00:00 UTC開(kāi)始計(jì)算的毫秒數(shù)作為參數(shù)。這意味著如果將Unix時(shí)間戳作為參數(shù)原押,必須將Unix時(shí)間戳乘以1000龄减。
new Date(1378218728000); // Tue Sep 03 2013 22:32:08 GMT+0800 (CST)
// 1970年1月2日的零時(shí)
var Jan02_1970 = new Date(3600*24*1000); // Fri Jan 02 1970 08:00:00 GMT+0800 (CST)
new Date(datestring)
Date對(duì)象還接受一個(gè)日期字符串作為參數(shù),返回所對(duì)應(yīng)的時(shí)間班眯。所有可以被Date.parse()方法解析的日期字符串希停,都可以當(dāng)作Date對(duì)象的參數(shù)
new Date("2013-02-15")
new Date("2013-FEB-15")
new Date("FEB, 15, 2013")
new Date("FEB 15, 2013")
new Date("Feberuary, 15, 2013")
new Date("Feberuary 15, 2013")
new Date("15, Feberuary, 2013")
new Date(year, month [, day, hours, minutes, seconds, ms])
在多個(gè)參數(shù)的情況下,Date對(duì)象將其分別視作對(duì)應(yīng)的年署隘、月宠能、日、小時(shí)磁餐、分鐘违崇、秒和毫秒。如果采用這種用法诊霹,最少需要指定兩個(gè)參數(shù)(年和月)羞延,其他參數(shù)都是可選的,默認(rèn)等于0脾还。如果只使用年一個(gè)參數(shù)伴箩,Date對(duì)象會(huì)將其解釋為毫秒數(shù)。
new Date(2013) // Thu Jan 01 1970 08:00:02 GMT+0800 (CST)
new Date(2013,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,1,0,0,0,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
上面代碼(除了第一行)返回的是2013年1月1日零點(diǎn)的時(shí)間鄙漏,可以看到月份從0開(kāi)始計(jì)算嗤谚,因此1月是0,12月是11怔蚌。但是巩步,月份里面的天數(shù)從1開(kāi)始計(jì)算。
這些參數(shù)如果超出了正常范圍桦踊,會(huì)被自動(dòng)折算椅野。比如,如果月設(shè)為15,就算折算為下一年的4月竟闪。參數(shù)還可以使用負(fù)數(shù)声离,表示扣去的時(shí)間。
new Date(2013,0) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,-1) // Sat Dec 01 2012 00:00:00 GMT+0800 (CST)
new Date(2013,0,1) // Tue Jan 01 2013 00:00:00 GMT+0800 (CST)
new Date(2013,0,0) // Mon Dec 31 2012 00:00:00 GMT+0800 (CST)
new Date(2013,0,-1) // Sun Dec 30 2012 00:00:00 GMT+0800 (CST)
日期運(yùn)算
類型轉(zhuǎn)換時(shí)瘫怜,Date對(duì)象的實(shí)例如果轉(zhuǎn)為數(shù)值术徊,則等于對(duì)應(yīng)的毫秒數(shù);如果轉(zhuǎn)為字符串鲸湃,則等于對(duì)應(yīng)的日期字符串赠涮。所以,兩個(gè)日期對(duì)象進(jìn)行減法運(yùn)算暗挑,返回的就是它們間隔的毫秒數(shù)笋除;進(jìn)行加法運(yùn)算,返回的就是連接后的兩個(gè)字符串炸裆。
var then = new Date(2013,2,1);
var now = new Date(2013,3,1);
now - then
// 2678400000
now + then
// "Mon Apr 01 2013 00:00:00 GMT+0800 (CST)Fri Mar 01 2013 00:00:00 GMT+0800 (CST)"
ES5 數(shù)組拓展
ES5為Array對(duì)象做了大幅拓展
Array.isArray(obj)
這是Array對(duì)象的一個(gè)靜態(tài)函數(shù)垃它,用來(lái)判斷一個(gè)對(duì)象是不是數(shù)組
var a = [];
var b = new Date();
console.log(Array.isArray(a)); //true
console.log(Array.isArray(b)); //false
.indexOf(element) / .lastIndexOf(element)
顧名思義,這兩個(gè)方法用于查找數(shù)組內(nèi)指定元素位置烹看,查找到第一個(gè)后返回其索引国拇,沒(méi)有查找到返回-1,indexOf從頭至尾搜索惯殊,lastIndexOf反向搜索酱吝。
var a = [1,2,3,3,2,1];
console.log(a.indexOf(2)); //1
console.log(a.lastIndexOf(2)); //4
.forEach(element, index, array)
遍歷數(shù)組,參數(shù)為一個(gè)回調(diào)函數(shù)土思,回調(diào)函數(shù)有三個(gè)參數(shù):
當(dāng)前元素
當(dāng)前元素索引值
整個(gè)數(shù)組
var a = new Array(1,2,3,4,5,6);
a.forEach(function(e,i,array){
array[i]= e + 1;
});
console.log(a); //[2, 3, 4, 5, 6, 7]
MDN詳細(xì)解釋forEach
感性理解
說(shuō)明:回調(diào)函數(shù)的參數(shù)务热,你寫(xiě)一個(gè),就表示要傳入一個(gè)己儒,打印的時(shí)候崎岂,寫(xiě)了對(duì)應(yīng)的參數(shù),也就會(huì)打印出相應(yīng)的參數(shù)
.every(function(element, index, array)) / .some(function(element, index, array))
這兩個(gè)函數(shù)類似于離散數(shù)學(xué)中的邏輯判定闪湾,回調(diào)函數(shù)返回一個(gè)布爾值
every是所有函數(shù)的每個(gè)回調(diào)函數(shù)都返回true的時(shí)候才會(huì)返回true冲甘,當(dāng)遇到false的時(shí)候終止執(zhí)行,返回false
some函數(shù)是“存在”有一個(gè)回調(diào)函數(shù)返回true的時(shí)候終止執(zhí)行并返回true响谓,否則返回false
在空數(shù)組上調(diào)用every返回true损合,some返回false
var a=new Array(1,2,3,4,5,6);
console.log(a.every(function(e, i, arr){
return e < 5;
}));
console.log(a.some(function(e,i,arr){
return e > 4;
}));
.map(function(element))
與forEach類似,遍歷數(shù)組娘纷,回調(diào)函數(shù)返回值組成一個(gè)新數(shù)組返回,新數(shù)組索引結(jié)構(gòu)和原數(shù)組一致跋炕,原數(shù)組不變
//返回一個(gè)新數(shù)組赖晶,每個(gè)元素是原數(shù)組的平方
var a = new Array(1,2,3,4,5,6);
console.log(a.map(function(e){
return e * e;
})); // [1, 4, 9, 16, 25, 36]
console.log(a); //[1, 2, 3, 4, 5, 6]
.filter(function(element))
返回?cái)?shù)組的一個(gè)子集,回調(diào)函數(shù)用于邏輯判斷是否返回,返回true則把當(dāng)前元素加入到返回?cái)?shù)組中遏插,false則不加
新數(shù)組只包含返回true的值捂贿,索引缺失的不包括,原數(shù)組保持不變
var a = new Array(1,2,3,4,5,6);
console.log(a.filter(function(e){
return e % 2 == 0;
})); // [2, 4, 6]
console.log(a); //[1, 2, 3, 4, 5, 6]
.reduce(function(v1, v2), value) / .reduceRight(function(v1, v2), value)
遍歷數(shù)組胳嘲,調(diào)用回調(diào)函數(shù)厂僧,將數(shù)組元素組合成一個(gè)值,reduce從索引最小值開(kāi)始了牛,reduceRight反向颜屠,方法有兩個(gè)參數(shù)
回調(diào)函數(shù):把兩個(gè)值合為一個(gè),返回結(jié)果
value鹰祸,一個(gè)初始值,可選
var a = new Array(1,2,3,4,5,6);
console.log(a.reduce(function(v1, v2){
return v1 + v2;
})); // 21
console.log(a.reduceRight(function(v1, v2){
return v1 - v2;
}, 100)); // 79
測(cè)試題
題目1
實(shí)現(xiàn)一個(gè)reduce函數(shù)甫窟,作用和原生的reduce類似。
Ex:
var sum = reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0); => 6
解答
function reduce(arr, iteratee, initValue){
var tmpArr = (initValue === undefined ? [] : [initValue]).concat(arr)
while(tmpArr.length > 1){
tmpArr.splice(0, 2, iteratee(tmpArr[0], tmpArr[1]))
}
return tmpArr[0]
}
var sum = reduce([3,5], function(v1, v2){
return v1 * v2
},4)
console.log(sum)
題目2
實(shí)現(xiàn)一個(gè)flatten函數(shù)蛙婴,將一個(gè)嵌套多層的數(shù)組 array(數(shù)組) (嵌套可以是任何層數(shù))轉(zhuǎn)換為只有一層的數(shù)組粗井,數(shù)組中元素僅基本類型的元素或數(shù)組,不存在循環(huán)引用的情況街图。 Ex: flatten([1, [2], [3, [[4]]]]) => [1, 2, 3, 4];
解答:
var arr = [3, [2, -4, [5, 7]], -3, ['aa', [['bb']]]]
var arr2 = flatten(arr)
console.log(arr2)
function flatten(arr){
return arr.reduce(function(initArr, currentArr){
return initArr.concat(Array.isArray(currentArr)?flatten2(currentArr):currentArr)
}, [])
}
function flatten2(arr){
var newArr = []
function _flat(arr){
arr.forEach(val=>{
if(Array.isArray(val)){
_flat(val)
}else{
newArr.push(val)
}
})
}
_flat(arr)
return newArr
}
Date對(duì)象注意事項(xiàng)
說(shuō)明:使用new之后才是對(duì)象
第一個(gè)坑
Date()返回一個(gè)無(wú)用的字符串
new Date()才返回一個(gè)對(duì)象
第二個(gè)坑
名字不好
d.getDate()返回的是幾號(hào)
d.getDay()返回的是星期幾
星期日返回的是0
第三個(gè)坑
month 從0開(kāi)始
生成一個(gè)想要的日期
var d = new Date(2012,1,1)//這里實(shí)際生成的是2012年2月1日
生成本時(shí)區(qū)時(shí)間
說(shuō)明:生成的時(shí)間是相對(duì)于1970年1月1日0:00:00來(lái)生成的浇衬,并不是相對(duì)于本時(shí)區(qū)生成的,所以想要將這個(gè)時(shí)間實(shí)現(xiàn)本時(shí)區(qū)的對(duì)應(yīng)餐济,需要調(diào)用d.toLocaleString()來(lái)實(shí)現(xiàn)径玖,但這個(gè)方法不收J(rèn)S 的控制,這個(gè)受瀏覽器和操作系統(tǒng)的影響颤介,例如梳星,將操作系統(tǒng)的時(shí)間改變了,這里的時(shí)間也會(huì)發(fā)生相應(yīng)的改變滚朵。還有就是冤灾,這個(gè)展現(xiàn)出來(lái)的格式在不同的瀏覽器上的樣式是不一樣的。
時(shí)間戳轉(zhuǎn)換為日期
說(shuō)明:當(dāng)只向Date()傳一個(gè)參數(shù)的時(shí)候辕近,這是認(rèn)為你傳的是個(gè)時(shí)間戳
一天有86400秒
Date()的范圍是-100000000天至100000000天
獲取可靠的時(shí)間需要使用時(shí)間戳或者UTC時(shí)間(Date.UTC()這個(gè)得到的是個(gè)時(shí)間戳)