學(xué)習(xí)使用 Math 數(shù)組 Date

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)


創(chuàng)建實(shí)例

屬性

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
})
unshift用法
數(shù)組中的empty

字面量

不使用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)系

image

棧方法

上面例子總有同學(xué)就發(fā)現(xiàn)了,尤其是其刪除方法喉誊,并不是我們希望的表現(xiàn)形式邀摆,我們很多時(shí)候希望刪除中間一個(gè)元素后,后面元素的index都自動(dòng)減一伍茄,數(shù)組length同時(shí)減一栋盹,就好像在一個(gè)堆棧中拿去的一個(gè),數(shù)組已經(jīng)幫我們做好了這種操作方式敷矫,poppush能夠讓我們使用堆棧那樣先入后出使用數(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]
使用實(shí)例

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();
索引不連續(xù)時(shí)逆序

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ù)


7的ASCII碼

10的ASCII碼
var a = [7,8,9,10,11];

a.sort(function(v1,v2){
    return v1-v2;
});
console.log(a);//[7, 8, 9, 10, 11]
年齡小到大排序
年齡大到小排序
對(duì)象按名字排序

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ì)象


時(shí)間存儲(chǔ)方法

日期字符串實(shí)例化為對(duì)象
  • +號(hào)調(diào)用valueof返回date對(duì)象毫秒數(shù)


    圖例
不同對(duì)象不同的valueof

說(shuō)明:三種方式返回時(shí)間對(duì)象毫秒數(shù)

1.Date.getTime() //時(shí)間對(duì)象都行
2.+new Date() //時(shí)間對(duì)象都行
3.Date.now() //返回當(dāng)前時(shí)間的時(shí)間戳孵户,其他時(shí)間對(duì)象不行
Date.now()實(shí)例

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
實(shí)例

.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
實(shí)例

.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


實(shí)例

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]
filter實(shí)例

.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
reduce實(shí)例

測(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)

date()
date()
使用new

說(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)換為日期

時(shí)間戳

說(shuō)明:當(dāng)只向Date()傳一個(gè)參數(shù)的時(shí)候辕近,這是認(rèn)為你傳的是個(gè)時(shí)間戳

時(shí)間戳為負(fù)數(shù)

一天有86400秒

Date()的范圍是-100000000天至100000000天

UTC獲取可靠時(shí)間

獲取可靠的時(shí)間需要使用時(shí)間戳或者UTC時(shí)間(Date.UTC()這個(gè)得到的是個(gè)時(shí)間戳)

判斷是否為閏年

判斷閏年
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末韵吨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子移宅,更是在濱河造成了極大的恐慌归粉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漏峰,死亡現(xiàn)場(chǎng)離奇詭異糠悼,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浅乔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門倔喂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铝条,“玉大人,你說(shuō)我怎么就攤上這事席噩“噻郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵悼枢,是天一觀的道長(zhǎng)埠忘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)馒索,這世上最難降的妖魔是什么莹妒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮双揪,結(jié)果婚禮上动羽,老公的妹妹穿的比我還像新娘。我一直安慰自己渔期,他們只是感情好运吓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著疯趟,像睡著了一般拘哨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上信峻,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天倦青,我揣著相機(jī)與錄音,去河邊找鬼盹舞。 笑死产镐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的踢步。 我是一名探鬼主播癣亚,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼获印!你這毒婦竟也來(lái)了述雾?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兼丰,失蹤者是張志新(化名)和其女友劉穎玻孟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鳍征,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黍翎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蟆技。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玩敏。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斗忌,死狀恐怖质礼,靈堂內(nèi)的尸體忽然破棺而出旺聚,到底是詐尸還是另有隱情,我是刑警寧澤眶蕉,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布砰粹,位于F島的核電站,受9級(jí)特大地震影響造挽,放射性物質(zhì)發(fā)生泄漏碱璃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一饭入、第九天 我趴在偏房一處隱蔽的房頂上張望嵌器。 院中可真熱鬧,春花似錦谐丢、人聲如沸爽航。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)讥珍。三九已至,卻和暖如春窄瘟,著一層夾襖步出監(jiān)牢的瞬間衷佃,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工蹄葱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氏义,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓图云,卻偏偏與公主長(zhǎng)得像惯悠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子琼稻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Date Date對(duì)象是JavaScript提供的日期和時(shí)間的操作接口 Date對(duì)象有幾個(gè)靜態(tài)方法 Date.no...
    南山碼農(nóng)閱讀 836評(píng)論 0 0
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,970評(píng)論 6 13
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,233評(píng)論 0 4
  • 你總說(shuō)沒(méi)衣服穿 看看衣柜那合不上的門 還有那么多鼓鼓箱子 干凈的書(shū)房 已成衣服重災(zāi)區(qū) 如果說(shuō)穿衣是為了遮丑 天吶 ...
    韓傾閱讀 541評(píng)論 2 3
  • 01 這個(gè)國(guó)慶長(zhǎng)假吮螺,恰遇中秋。原本歡騰的節(jié)日帕翻,偏偏天空不作美鸠补。溫度從25度左右狂降到13度,伴著綿長(zhǎng)的秋雨嘀掸,那樣的...
    墨香紅塵閱讀 473評(píng)論 0 7