JS2

第五章*****************************************************************************************

什么是索引數(shù)組: 下標(biāo)都是數(shù)字的數(shù)組

關(guān)聯(lián)數(shù)組:

什么是: 可自定義下標(biāo)名稱的數(shù)組

為什么: 為了讓每個(gè)元素都有一個(gè)專門的名稱

好處: 1. 便于維護(hù)倒淫;2.快速查找

何時(shí): 1. 希望每個(gè)元素都有明確的意義時(shí)

? ? ? 2. 快速定位想要的元素時(shí)

如何: 2件事(創(chuàng)建、訪問)

創(chuàng)建分2步:

??? 1. 先創(chuàng)建空數(shù)組:var arr=[];

??? 2.向空數(shù)組中添加新元素,要使用自定義的下標(biāo)名稱

? ? ? ?EX:ym["name"]="楊冪"

? ? ? ? ? ?ym["math"]=81;

? ? ? ? ? ?ym["chs"]=59;

? ? ? ? ? ?ym["eng"]=89;

訪問: 用法和訪問索引數(shù)組完全一樣,同變量的用法,只不過要使用自定義的下標(biāo)名稱

關(guān)聯(lián)數(shù)組中.length屬性失效送滞,永遠(yuǎn)等于0

因?yàn)殛P(guān)聯(lián)數(shù)組中沒有數(shù)字下標(biāo),length無法+1

遍歷關(guān)聯(lián)數(shù)組(鍵值對的集合): 只能用for( in )

for(var key in arr){? /*in:自動(dòng)依次取出arr中每個(gè)下標(biāo)名稱保存在變量key中;key:當(dāng)前房間號:鍵*/

?arr[key]; ? ? ? ? ? ? ? //當(dāng)前元素值: value躺坟,當(dāng)前屬性名: key

} ? ? ? ? ? ? ? ? ? ? ? ?? /*強(qiáng)調(diào): key不能加引號, 因?yàn)槊看窝h(huán)都在變化*/

索引數(shù)組:無法提前預(yù)知元素的具體位置,只能靠遍歷查找乳蓄,受元素個(gè)數(shù)和元素存儲(chǔ)位置影響極大(慢)

關(guān)聯(lián)數(shù)組:直接通過下標(biāo)定位元素位置咪橙,查找速度和元素個(gè)數(shù)及元素位置無關(guān)(快)

關(guān)聯(lián)數(shù)組原理:hash算法: 根據(jù)一個(gè)字符串,計(jì)算出盡量不重復(fù)的一個(gè)序號虚倒。相同的字符串計(jì)算出的序號一定相同美侦,相同下標(biāo)的值會(huì)覆蓋原先的值

向關(guān)聯(lián)數(shù)組中保存元素:

? ? 將自定義下標(biāo)名交給hash算法,計(jì)算一個(gè)散列的位置序號魂奥。將元素保存到序號指定位置

從關(guān)聯(lián)數(shù)組中取值時(shí):

? ? 將自定義下標(biāo)名交給hash算法菠剩,計(jì)算出和存入時(shí)完全相同的序號,引擎直接去序號位置獲得元素

? ? 優(yōu)點(diǎn): 不受存儲(chǔ)位置和元素個(gè)數(shù)的影響

_______________________________________________________________________________________________

1. 數(shù)組API

什么是數(shù)組: 存儲(chǔ)多個(gè)數(shù)據(jù)耻煤,并提供了操作數(shù)據(jù)的API的對象

API: 別人已經(jīng)實(shí)現(xiàn)的具壮,咱們用現(xiàn)成的程序

將數(shù)組轉(zhuǎn)字符串有2種:

?String(arr): 將arr中每個(gè)元素都轉(zhuǎn)為字符串,用逗號連接

? ? 何時(shí): 給數(shù)組拍照哈蝇,查看數(shù)組的中間修改狀態(tài)棺妓,判斷操作前后數(shù)組是否發(fā)生了變化

?arr.join("自定義連接符"): 將arr中每個(gè)元素都轉(zhuǎn)為字符串,用自定義的連接符連接元素

? ? 何時(shí): 只要不希望使用逗號連接符時(shí)

固定套路: 1. 把單詞拼接為句子

? ? ? ? ? 2. 無縫拼接:

? ? ? ? ? ?? 錯(cuò)誤: arr.join() <=> String(arr) ?=>輸出為逗號連接

? ? ? ? ? ?? 正確: arr.join("")

? ? ? ? ? ?? 重要用途: 判斷數(shù)組是否為空

? ? ? ? ? 3.動(dòng)態(tài)生成頁面元素(只會(huì)在元素之間添加連接符买鸽,所以要在arr.join("...")前后補(bǔ)全標(biāo)簽)

? ? ? ? ? ? ?2步:①?var html="<ANY>"+arr.join("</ANY><ANY>")+"</ANY>";

? ? ? ? ? ? ? ? ? ? 或 var html="<ul>"+uls.join("")+"</ul>";

? ? ? ? ? ? ? ?? ② elem.innerHTML=html;

console.log(String(arr)),console.log(arr),console.dir(arr)

console.log(arr); 先輸出dir的結(jié)構(gòu)涧郊,刷新后變?yōu)镾tring(arr)

僅輸出內(nèi)容,不關(guān)心結(jié)構(gòu): console.log(String(arr))

查看數(shù)組存儲(chǔ)結(jié)構(gòu): console.dir(arr) ? ? ? ? ? /*dir查看結(jié)果時(shí)眼五,不遵循先后執(zhí)行的順序*/

判斷數(shù)組中是否含有某個(gè)元素:

數(shù)組可用indexOf搜索某個(gè)元素的下標(biāo)妆艘,返回在數(shù)組中找到的給定元素的第一個(gè)索引彤灶,若不存在,則返回-1批旺,但數(shù)組元素需要完全相等(===)才會(huì)搜索成功幌陕,且不識別NaN

如: var arr = ['啦啦',2,4];

? ? arr.indexOf('啦');? ? //-1

? ? arr.indexOf('啦啦');? //0

使用ES6的擴(kuò)展運(yùn)算符(...)代替cancat,可以更方便的合并數(shù)組

如: var arr1 = [1,2,3];

? ? var arr2 = [4,...arr1,5];? ? //[4,1,2,3,5]

toLocaleString()可將數(shù)組中的每個(gè)元素用逗號(,)隔開汽煮,組成字符串(調(diào)用join()方法)

var?str = arr.toLocaleString()

_______________________________________________________________________________________________

拼接和選取: 都無權(quán)修改原數(shù)組搏熄,只能返回新數(shù)組對象

拼接: 將多個(gè)數(shù)組或元素,和當(dāng)前數(shù)組拼接為一個(gè)新數(shù)組

? ? ? 如何:var newArr=arr1.concat(值1,值2,arr2,...);

? ? ? 強(qiáng)調(diào): 1.不修改原數(shù)組暇赤,只返回新數(shù)組

? ? ? ? ? ? 2. 可打散數(shù)組類型的參數(shù)為單個(gè)元素心例,再拼接 ? ? ? ? ? /*concat獨(dú)有*/

? ? ? 注意:?若是大數(shù)組會(huì)消耗大量內(nèi)存,可用arr1.push.apply(arr1, arr2)代替鞋囊,將arr2合并到arr1中

選取: 復(fù)制原數(shù)組中指定開始位置到結(jié)束位置之間的多個(gè)元素止后,組成新數(shù)組———原數(shù)組保持不變

? ? ? 如何:var subArr=arr.slice(starti,endi+1);

? ? ? 強(qiáng)調(diào): 1.不修改原數(shù)組,僅復(fù)制出想要的元素組成新數(shù)組

? ? ? ? ? ? 2.如果一個(gè)API的兩個(gè)參數(shù)都是下標(biāo)時(shí)溜腐,就含頭不含尾

? ? ? 簡寫: 1. 如果參數(shù)位置離結(jié)尾近景醇,可用負(fù)數(shù)下標(biāo):

? ? ? ? ? ? ?? arr.length-n 可簡寫為:-n(倒數(shù)第n個(gè)(不包含尾))(API自動(dòng)加length)

? ? ? ? ? ? 2. 可省略第二個(gè)參數(shù)(-1)就谜,表示一直選取到結(jié)尾

? ? ? ? ? ? 3. 兩個(gè)參數(shù)都可省略: 完整復(fù)制一個(gè)數(shù)組(地址值不同)

_______________________________________________________________________________________________

兩個(gè)對象作比較(arr2==arr1):

不做任何轉(zhuǎn)換疯淫,直接比較兩個(gè)對象的地址值宪卿,用于判斷兩個(gè)變量是否引用同一個(gè)對象

引用類型的對象(arr2=arr1):用新變量修改對象,等效于直接修改原對象望众,新舊變量都受影響(地址值相同)

復(fù)制數(shù)組(地址值不同):①選取復(fù)制: var arr2=arr1.slice();

? ? ? ? ? ? ? ? ? ? ? ②復(fù)制索引數(shù)組:for(var?i=0;i<arr2.length;i++){arr2[i]=arr1[i]};

? ? ? ? ? ? ? ? ? ? ? ③復(fù)制關(guān)聯(lián)數(shù)組:for(var key in arr1){key; arr2[key]=arr1[key]};

_______________________________________________________________________________________________

修改數(shù)組: splice(強(qiáng)調(diào): 直接修改原數(shù)組)

刪除元素:arr.splice(starti,n)

? 刪除starti位置開始的n個(gè)元素

? 強(qiáng)調(diào): 不必考慮含頭不含尾(n是個(gè)數(shù))

? 其實(shí)有返回值: 返回被刪除的元素組成的臨時(shí)數(shù)組

? ??var deletes=arr.splice(starti,n);? ? ? ? ? ? /*deletes保存了刪除的元素*/

? 簡寫: 1. 支持負(fù)數(shù)下標(biāo)匪补,表示倒數(shù)第n個(gè)(自動(dòng)用length-n)

? ? ? ? 2. 省略n(從starti 刪到結(jié)尾)

插入新元素:arr.splice(starti,0,值1,值2,...)? ? ? ?//刪除0個(gè)

? ? 在starti位置插入新的值1,值2,...

? ? 強(qiáng)調(diào): 1.原starti位置的值及其之后的值被向后順移

? ? ? ? ? 2.不支持打散數(shù)組類型參數(shù)(如果插入一個(gè)數(shù)組,將變成二維數(shù)組)

替換:?arr.splice(starti,n,值1,值2,...)

? ? 先刪除舊的黍檩,再在同一位置插入新的

? ? 先刪除starti開始的n個(gè)元素叉袍,再在starti位置插入值1,值2,...

? ? 強(qiáng)調(diào): 刪除的個(gè)數(shù)和插入的個(gè)數(shù)不必相同

翻轉(zhuǎn): ?arr.reverse();

_______________________________________________________________________________________________

排序:

什么是: 將數(shù)組中的元素按從小到大或從大到小的順序重新排列

何時(shí): 任何數(shù)據(jù)在給用戶展示前,必須先排序

如何:arr.sort(); ? ? ? ? ? ? /*將 arr 數(shù)組按字符串升序刽酱,直接修改原數(shù)組*/

? 原理: 將所有元素都轉(zhuǎn)為字符串喳逛,再按字符串升序排列

? 何時(shí): 只有按字符串升序排列時(shí),才用默認(rèn)的sort()

問題: 只能按字符串升序排列

解決:自定義比較器函數(shù):

? 什么是: 專門比較任意兩值大小的函數(shù)

? 何時(shí): 如果sort默認(rèn)的排序規(guī)則不是想要的棵里,可自定義比較器代替sort中默認(rèn)的排序規(guī)則

要求: 2個(gè)參數(shù): a,b

返回值: 如果a>b润文,就返回正數(shù)

? ? ? ? 如果a<b,就返回負(fù)數(shù)

? ? ? ? 否則返回0

最簡單的數(shù)字升序比較器

function cmp(a,b){return a-b;}; ? ? ? /*定義比較器函數(shù)*/

arr.sort(cmp); ? ? ? ? ? ? ? ? ? ? ? ?/*傳入sort()中*/

簡化為:arr.sort(function(a,b){return a-b})殿怜;? ?/*cmp=function(a,b){return a-b;}*/

? ? ? ? ? ? ? /* 對對象的值進(jìn)行排序: arr.sort(function(a,b){ return obj[a]-obj[a] }) */

如何使用: 將比較器函數(shù)對象作為參數(shù)傳入sort()函數(shù)中

強(qiáng)調(diào):不加()? ? ? ? ? ? ?/*cmp: 回調(diào)函數(shù)callback典蝌,不加()*/

回調(diào)函數(shù):自己定義的函數(shù),自己不調(diào)用头谜,不只調(diào)用一次骏掀,而是傳入另一個(gè)函數(shù)中,被另一個(gè)函數(shù)反復(fù)調(diào)用

何時(shí): 只要對數(shù)字元素排序,都要自定義比較器函數(shù)

遞歸調(diào)用:函數(shù)內(nèi)又調(diào)用了自己(效率極低截驮,幾乎所有的遞歸都可用循環(huán)代替)

問題2: 如何降序:

解決: 只要顛倒比較器結(jié)果的正負(fù)號笑陈,就可改升序?yàn)榻敌?/p>

最簡單的數(shù)字降序比較器

function cmp(a,b){return b-a};

arr.sort(cmp);

簡化為: arr.sort(function(a,b){return b-a});

_______________________________________________________________________________________________

2. 棧和隊(duì)列

說明: js中沒有專門的棧和隊(duì)列結(jié)構(gòu)葵袭,都是用普通數(shù)組模擬的

棧stack:

什么是棧: 一端封閉涵妥,只能從另一端進(jìn)出的數(shù)組

? ? ? ? ? 棧是限定僅在表頭/表尾進(jìn)行插入/刪除操作的線性表

何時(shí): 只要希望始終使用最后進(jìn)入數(shù)組的新元素時(shí)(先進(jìn)后出)

如何:

? 1. 結(jié)尾出入棧:

????結(jié)尾入棧: arr.push(值)<=> ?arr[arr.length]=值?? /*在末尾追加一個(gè)新值*/

? ?? 強(qiáng)調(diào): 1. 其實(shí)push可壓入多個(gè)值: arr.push(值1, 值2)

? ? ? ? ?? 2. 不支持打散數(shù)組參數(shù) ? ? ? ? ? ? ? ? ? ? //可用來創(chuàng)建二維數(shù)組

????結(jié)尾出棧: var last=arr.pop();? ? ? ? ? ? ? ? ? ?/*移出數(shù)組末尾的最后一個(gè)元素*/

? 2. 開頭出入棧:

????開頭入棧: arr.unshift(值)? ? ? ? ? ? ? ? ? ? ? ? /*在開頭插入一個(gè)值*/

? ?? 強(qiáng)調(diào): 開頭入棧后的元素順序和結(jié)尾入棧后的元素順序是相反的

????開頭出棧: var first=arr.shift();? ? ? ? ? ? ? ?/*移出數(shù)組開頭的第一個(gè)元素*/

隊(duì)列queue:

什么是: 只能從結(jié)尾進(jìn)入,從開頭出的數(shù)組坡锡,是事件循環(huán)(Event Loop)的基礎(chǔ)結(jié)構(gòu)

何時(shí): 只要希望按照先來后到的順序使用數(shù)組元素時(shí)

如何: 1. 從結(jié)尾入隊(duì)列:arr.push(值);

? ? ? 2. 從開頭出隊(duì)列:var first=arr.shift();

堆:

堆數(shù)據(jù)結(jié)構(gòu)是一種樹狀結(jié)構(gòu)蓬网,它使用key-value的形式存儲(chǔ),是無序的

變量的存放:

基本數(shù)據(jù)類型:?保存在棧內(nèi)存中鹉勒,占有固定大小的空間帆锋,通過按值來訪問

引用類型:?保存在堆內(nèi)存中,因?yàn)橹档拇笮〔还潭趁郑圆荒鼙4娴綏?nèi)存中窟坐,但內(nèi)存地址大小是固定的海渊,可以保存在棧內(nèi)存中绵疲。當(dāng)查詢引用類型的變量時(shí),先從棧中讀取內(nèi)存地址臣疑,然后通過內(nèi)存地址找到堆中的值盔憨,一般叫做按引用訪問

_______________________________________________________________________________________________

總結(jié): 向數(shù)組中添加元素4種:

1. concat():①不修改原數(shù)組,返回新數(shù)組

? ? ? ? ? ?? ②在結(jié)尾拼接元素

? ? ? ? ? ?? ③支持打散數(shù)組類型參數(shù)讯沈,另一個(gè)是.apply()郁岩,只有這兩個(gè)能打散數(shù)組

2. splice():①直接修改原數(shù)組

? ? ? ? ? ?? ②在任意位置插入新元素

? ? ? ? ? ?? ③不支持打散數(shù)組類型參數(shù)

3. push():①直接修改原數(shù)組

? ? ? ? ?? ②只能在結(jié)尾拼接元素

? ? ? ? ?? ③不支持打散數(shù)組類型參數(shù)

4. shift():①直接修改原數(shù)組

? ? ? ? ? ? ②只能在開頭拼接元素

? ? ? ? ? ? ③不支持打散數(shù)組類型參數(shù)

取出數(shù)組元素: 4種:

1. slice():①可獲取任意位置的任意個(gè)元素

? ? ? ? ? ? ②不修改原數(shù)組,返回選中的元素組成的新數(shù)組

2. splice():①刪除任意位置的任意個(gè)元素

? ? ? ? ? ?? ②直接修改原數(shù)組

? ? ? ? ? ?? ③返回被刪除的元素組成的新數(shù)組

3. pop():只能從結(jié)尾刪除一個(gè)元素缺狠,并返回

4. shift():只能從開頭刪除一個(gè)元素,并返回

_______________________________________________________________________________________________

3.二維數(shù)組

什么是: 數(shù)組中的元素挤茄,又引用了另一個(gè)子數(shù)組

何時(shí):

? 1. 保存橫行豎列的二維數(shù)據(jù)

? 2. 一個(gè)大的數(shù)組中如叼,還需要對元素進(jìn)行更細(xì)致分類

如何創(chuàng)建: 2種:

1. 先創(chuàng)建空數(shù)組,再添加子數(shù)組:

var arr=[];

? arr[0]=[0,0,0,0];

? arr[1]=[0,0,0,0];

? ...

2. 創(chuàng)建數(shù)組同時(shí),初始化子數(shù)組

var arr=[

? [0,0,0,0],

? ... ,

? [0,0,0,0]

];

訪問:arr[r][c](r行號榴捡,c列號)? 用法和普通數(shù)組的元素及變量完全一樣

越界: 二維數(shù)組的行下標(biāo)r梁沧,不能越界施敢,越界報(bào)錯(cuò)

遍歷二維數(shù)組:

for(var r=0;r<data.length;r++){ ? ? ? ? //外層循環(huán)控制行

? for(var c=0;c<data[r].length;c++){ ? ?//內(nèi)層循環(huán)控制列

? ? data[r][c] ? ? ? ? ? ? ? ? ? ? ? ?? //獲得當(dāng)前元素

}?}

創(chuàng)建二維數(shù)組:

var arr=[];

for (var i=0;i<N;i++ ){

? arr[i]=[]; ? ? ? ? ? ? ? ?//創(chuàng)建一個(gè)二維數(shù)組先壕,內(nèi)容為空

? for (var j=0;j<M;j++){? ? //為二維數(shù)組賦值 或填充n個(gè)空元素: arr1[i]=new Array(n);

? arr[i][j]=0;

} }

冒泡排序算法(一維數(shù)組):

function bubblesort(arr){

? for(varr=1;r<arr.length;r++){ ? ? ? ? //外層循環(huán)控制輪數(shù)

? ? for(vari=0;i<arr.length-r;i++){ ? ? //內(nèi)層循環(huán)控制每輪中的比較次數(shù)

? ? ? if(arr[i]>arr[i+1]){ ? ? ? ? ? ? ? //如果i位置的值>i+1位置的值

? ? ? ? arr[i]^=arr[i+1]; ? ? ? ? ? ? ? ?//交換兩位置的值

? ? ? ? arr[i+1]^=arr[i];

? ? ? ? arr[i]^=arr[i+1];

} } } }

第六章*****************************************************************************************

三碍岔、String類型

什么是: 由多個(gè)字符組成的"只讀"字符數(shù)組

String API: 強(qiáng)調(diào): 所有String API都無權(quán)修改原字符串浴讯,只能返回新字符串

VS 數(shù)組: 相同:?1. 下標(biāo);如:str[1] ? ?2. .length

? ? ? ? ? ?? 3.var subArr=arr.slice(starti,endi+1);(選取蔼啦,無權(quán)修改原數(shù)組)

? ? ? ?? 不同: 類型不同, API不通用

內(nèi)置對象: ES標(biāo)準(zhǔn)中規(guī)定的榆纽,瀏覽器廠商已經(jīng)實(shí)現(xiàn)的對象

包括11個(gè):

? String? Number? Boolean? ————— ?這3個(gè)是包裝類型

? Array ? Date ? ?Math ? RegExp

? Error

? Function ?Object

? Global (在瀏覽器中被window代替)

包裝類型

什么是:專門包裝原始類型的值,并提供操作原始類型值的API

為什么: 原始類型的值本身不具有任何功能捏肢,才需要包裝類型對象的幫助奈籽,完成功能

何時(shí): 一般不必手動(dòng)使用

? ? ? 只要試圖用原始類型的值調(diào)用函數(shù)時(shí),都會(huì)自動(dòng)創(chuàng)建包裝類型的對象鸵赫,調(diào)用對象的函數(shù)執(zhí)行操作

注意: 只要引用了字符串的屬性(.屬性)衣屏,字符串就會(huì)通過調(diào)用new String(str)的方式轉(zhuǎn)換成對象,這個(gè)對象繼承了字符串的方法辩棒,并被用來處理屬性的引用狼忱,一旦屬性引用結(jié)束,這個(gè)新創(chuàng)建的對象就會(huì)銷毀(實(shí)質(zhì)上并不一定創(chuàng)建和銷毀一睁,但整個(gè)過程看起來是這樣的)

比如: n.toFixed(2) => ?typeof n => ?number

? ? ? <=>new Number(n).toFixed(2)

?? str.charCodeAt() =>typeof str =>string

?? <=>new String(str).charCodeAt()

大小寫轉(zhuǎn)換

將字符串中所有字母钻弄,統(tǒng)一轉(zhuǎn)為大寫或小寫

str.toLowerCase() ? ? ? ?? 轉(zhuǎn)小寫

str.toUpperCase() ? ? ? ?? 轉(zhuǎn)大寫

何時(shí): 不區(qū)分大小時(shí),都要先轉(zhuǎn)為一致的大小寫卖局,再比較或判斷:?驗(yàn)證碼斧蜕,用戶名,電子郵件

獲得指定位置的字符:?str.charAt(i)? =>? str[i]

獲得指定位置字符的unicode號:?str.charCodeAt(i) ? ? ?? 獲得str中i位置的字符的unicode號

將unicode號砚偶,反向轉(zhuǎn)回文字: ? String.fromCharCode(unicode號) ?? 一次只能轉(zhuǎn)一個(gè)字,要用循環(huán)

獲取子字符串:3種

str.slice(starti, endi+1)

str.substring(starti, endi+1) ?? 用法同slice洒闸,但不支持負(fù)數(shù)參數(shù)(負(fù)數(shù)自動(dòng)轉(zhuǎn)為0染坯,取較小的值作為開始位置)

str.substr(starti, n)? ? ? ? ? ? ? ? 從starti開始,獲取n個(gè)字符丘逸,n是個(gè)數(shù)单鹿,省略則到結(jié)尾為止

_______________________________________________________________________________________________

查找關(guān)鍵詞: 4種:

1. 查找一個(gè)固定關(guān)鍵詞的位置(僅查找規(guī)則內(nèi)的第一個(gè))

var i=str.indexOf("關(guān)鍵詞",fromi)

? 在str中fromi位置之后,查找下一個(gè)"關(guān)鍵詞"的位置

返回值: 找到的關(guān)鍵詞的下標(biāo)位置i

? ? ? ? 如果沒找到深纲,返回-1

? 簡寫: 省略fromi仲锄,默認(rèn)從0開始

var i=-1;

do{

? i=str.indexOf("關(guān)鍵詞",i+1);

? if(i!=-1)

? ? console.log("在位置"+i+"發(fā)現(xiàn)關(guān)鍵詞");

? else break;

}while(true);

2. 查找最后一個(gè)關(guān)鍵詞的位置

var i=str.lastIndexOf("關(guān)鍵詞");

用于獲取文件的擴(kuò)展名(取最后一個(gè).后的剩余字符串)

indexOf的問題: 只能查找一個(gè)固定關(guān)鍵詞的位置

解決: 正則表達(dá)式模糊匹配多種關(guān)鍵詞

3. 判斷字符串中是否包含符合規(guī)則的關(guān)鍵詞

var i=str.search(/reg/i) ?? /*reg: 正則表達(dá)式,在str中找到第一個(gè)符合正則要求的敏感詞的位置*/

返回值: 返回關(guān)鍵詞的下標(biāo)位置i

? ? ? ? 如果沒找到返回-1

? 問題: 正則表達(dá)式默認(rèn)都是區(qū)分大小寫的

? 解決:在第二個(gè)/后加i,表示忽略(ignore)大小寫

? 何時(shí): 只要僅判斷有沒有關(guān)鍵詞時(shí)湃鹊,首選search

? 問題: 1. 只能查找第一個(gè)關(guān)鍵詞儒喊,無法找所有

? ? ? ? 2. 僅返回位置,無法返回關(guān)鍵詞內(nèi)容

4. 查找所有關(guān)鍵詞的內(nèi)容

var kwords=str.match(/reg/ig); ? ? ? ?//也可使用字符串币呵,結(jié)果為查找到的字符串

返回值: 返回所有關(guān)鍵詞組成的數(shù)組

? ? ? ? 如果沒找到怀愧,返回null

使用正則時(shí): 數(shù)組的第一個(gè)元素(下標(biāo)為0)表示第一個(gè)分組,下標(biāo)為2的是第二個(gè)分組

使用/g時(shí): 下標(biāo)為0的是找到的第0個(gè)分組,下標(biāo)為1的是第一個(gè)分組芯义,下標(biāo)為2的是第二個(gè)分組

使用字符串時(shí)哈垢,下標(biāo)為0的是找到的字符串,index是下標(biāo)扛拨,input是要查找的字符串

? 問題: 正則表達(dá)式默認(rèn)只匹配第一個(gè)符合條件的敏感詞

? 解決:在第二個(gè)/后加g耘分,表示查找全部(global)

? 何時(shí): 僅希望獲得關(guān)鍵詞內(nèi)容時(shí)

? 問題: 只能獲得內(nèi)容,無法獲得每個(gè)敏感詞的位置

? 解決: 查找每個(gè)關(guān)鍵詞內(nèi)容绑警,又查找位置: regExp.exec()

_______________________________________________________________________________________________

替換: 將字符串中找到的關(guān)鍵詞陶贼,替換為指定的新內(nèi)容(2種), (無權(quán)修改原字符串,只能返回新字符串)

1. 簡單替換: 將所有關(guān)鍵詞都替換為同一種新值

str=str.replace(/reg/ig,"新值");

2. 高級替換: 根據(jù)每個(gè)關(guān)鍵詞的不同待秃,動(dòng)態(tài)選擇替換不同的新值

str=str.replace(/reg/ig,function(kw){ ? ? ?/*回調(diào)函數(shù)拜秧,kw 自動(dòng)獲得本次找到的關(guān)鍵詞*/

? return ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*根據(jù)不同的kw,動(dòng)態(tài)返回不同的值*/

})

衍生:刪除: 將關(guān)鍵詞替換為""

str=str.replace(/reg/ig,"")

str.replace(/(^\s+)|(\s+$)/g, "") ? ? ? ? //去掉字符串首尾的空字符

切割: 按指定關(guān)鍵字章郁,將一個(gè)字符串切割為多段子字符串(2種)

返回: 返回的是多個(gè)子字符串組成的數(shù)組枉氮,切割后的結(jié)果中,不包含分隔符

注意:當(dāng)分隔符不為空字符("")時(shí)暖庄,分隔符在邊界或連續(xù)出現(xiàn)兩個(gè)時(shí)聊替,會(huì)形成一個(gè)空字符

? ? ?分隔符的個(gè)數(shù) = str.split("分隔符").length-1? ?//字符串分隔后組成的數(shù)組長度-1

1. 簡單: 分隔符是固定的:

var subStrs=str.split("分隔符") ? ? ? ? ? ?//不修改原字符串

2. 復(fù)雜: 分隔符不是固定的:

var subStrs=str.split(/reg/i);

固定套路: 將字符串打散為字符數(shù)組: var chars=str.split("");

多字符切割: var newStr = oldStr.split(/\:|\./g);

? ? ? ? ? ? var newStr = oldStr.split(/[共]|[注]|[元]/g);

function zhao(str){ ? ? ? ? //查找一個(gè)字符串中每個(gè)字符連續(xù)出現(xiàn)的次數(shù)

? var arr1=str.split("");

? arr1.sort(); ? ? ? ? ? ?? //查找一共出現(xiàn)的次數(shù)用arr.sort()先排序再查找

? for(var i=0,j=1;i<arr1.length;i++){

? ? if(arr1[i]===arr1[i+1]){

? ? ? j++;

? ? }else{

? ? ? console.log(arr1[i]+":"+j);

? ? ? j=1;

}?}?}

//截取url的后lastNum*2個(gè)字段

function getUrlInfo(lastNum){

var infoArr = location.href.split(/\?|\/|\&|\=/g);

? var arr = infoArr.slice(-lastNum*2);

? var result = new Object();

? for(var i=0; i<arr.length; i+=2){

? ? result[arr[i]] = arr[i+1];

? }

? return result;

}

_______________________________________________________________________________________________

正則表達(dá)式:Regular Expression

什么是: 規(guī)定一個(gè)字符串中字符出現(xiàn)規(guī)律的規(guī)則

何時(shí):2種:?1.模糊查找多種關(guān)鍵詞

? ? ? ? ? 2.驗(yàn)證用戶輸入的格式

如何:

1.最簡單的正則表達(dá)式,就是關(guān)鍵詞原文本身

2.字符集

什么是: 規(guī)定一位字符 備選字符列表 的集合

何時(shí): 只要一位字符培廓,有多種可能備選時(shí)

如何:[備選字符列表]? ? ? ? ? ? ? ? ? ? ? ? //?表示選擇其中之一

強(qiáng)調(diào): 中間不要加逗號(惹悄,)

? ? ? 一個(gè)字符集([])只能規(guī)定一位字符的備選字

簡寫: 如果字符列表中 部分備選字符的unicode是連續(xù)的,可用-省略中間字符

比如:?[0-9] ? ? ? ? ? ?? 一位數(shù)字

? ? ? [a-z] ? ? ? ? ? ?? 一位小寫字母

? ? ? [A-Z] ? ? ? ? ? ?? 一位大寫字母

? ? ? [A-Za-z] ? ? ? ? ? 一位字母

? ? ? [0-9A-Za-z] ? ? ?? 一位字母或數(shù)字

? ? ? [\u4e00-\u9fa5] ? ?一位漢字

特殊:[^字符列表] ? ? ?? 除了××

3.預(yù)定義字符集

什么是: 對常用特定字符集的更簡化寫法:4個(gè):

? \d ? ? ?? 一位數(shù)字 ?=> [0-9]

? \w ? ? ?? 一位字母,數(shù)字或_ ?=> [0-9A-Za-z_]

?\s ? ? ? 一位空字符: 空格,Tab...

?.? ? ? ? 通配符(匹配除回車肩钠、換行\(zhòng)n\r外的任意字符)

? \D? ? ? ? 類似[^0-9]泣港,非數(shù)字

? \W? ? ? ? 類似[^0-9A-Za-z_],除\w外的符號

? \S? ? ? ? 非\s的所有內(nèi)容

\***: 是轉(zhuǎn)義字符价匠,表示引用符 ? 比如: \. ?匹配點(diǎn)字符 ? \$匹配美元符號

空字符和空字符串不一樣当纱,空字符用|表示

4.量詞

什么是: 規(guī)定一位字符集出現(xiàn)次數(shù)的規(guī)則

何時(shí): 只要規(guī)定一位字符集出現(xiàn)的位數(shù)/次數(shù)

如何: 量詞必須緊跟在修飾的字符集之后,用來修飾相鄰的前一個(gè)字符集

包括: 2大類:

? ① 有明確數(shù)量邊界的:

? ?? 字符集{n,m} 至少n個(gè)踩窖,最多m個(gè)

? ?? 字符集{n,} ?至少n個(gè)坡氯,多了不限

? ?? 字符集{n} ? 必須n個(gè)

? ② 沒有明確數(shù)量邊界的:

? ?? 字符集? ? 可有可無,最多1個(gè)

? ?? 字符集* ? 可有可無洋腮,多了不限

? ??字符集+? ?至少一個(gè)箫柳,多了不限

5.選擇和分組

選擇:或

何時(shí): 只要在多個(gè)規(guī)則中,任選其一匹配時(shí)

? 規(guī)則1|規(guī)則2|規(guī)則三...? (只要滿足3個(gè)規(guī)則之一即可) ?? /*|在正則中啥供,優(yōu)先級最低*/

分組: 用()將多個(gè)規(guī)則分為一組

何時(shí): 只要希望一個(gè)量詞同時(shí)修飾多個(gè)字符集時(shí)悯恍,就要先將多個(gè)字符集分為一組(),再用量詞修飾分組

為什么: 默認(rèn)字符集僅修飾相鄰的前一個(gè)字符集

比如: ??var reg=/(\d{2})\/(\d{2})\/(\d{4})/g; ? ?//將'07/29/2017'分為3組

反向引用:

var str = '2017-07-29'.replace(/(\d{4})-(\d{2})-(\d{2})/g, '$2/$3/$1'); ?//str: 07/29/2017

忽略分組: 不希望捕獲某些分組滤灯,只需要在分組內(nèi)加上?:即可

var str = '2017-07-29'.replace(/(?:\d{4})-(\d{2})-(\d{2})/g,'$2/$1'); ? ? //str: 29/07

$1~$9存放著正則表達(dá)式中最近的9個(gè)正則表達(dá)式的提取結(jié)果坪稽,這些結(jié)果按照子匹配的出現(xiàn)順序依次排列

語法: RegExp.$n

這些屬性是靜態(tài)的曼玩,除了replace中的第二個(gè)參數(shù)可以省略RegExp外,其它地方使用都要加上RegExp

身份證號: 15位數(shù)字? 2位數(shù)字? 1位數(shù)字或Xx? /*后兩部分窒百,可有可無黍判,最多1次*/

? ? reg = \d{15} ?? (\d\d ? [0-9Xx]) ? ? ?

reg = /(^[1-9]\d{5} ?(18|19|([23]\d))\d{2} ?((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31) ?\d{3}[0-9Xx]$)|(^[1-9]\d{5} ?\d{2} ?((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31) ?\d{2}$)/

手機(jī)號: +86或0086 ? ? 可有可無,最多一次

???????? 空格 ? ? ? ? 可有可無篙梢,多了不限

???????? 1

???????? 3,4,5,7,8 ?? 選一個(gè)

???????? 9位數(shù)字

??? (\+86|0086)?\s*1[34578]\d{9}

reg = /^0?(13[0-9]|14[57]|15[012356789]|17[013678]|18[0-9])\d{8}$/

微 信 wei xin w x

? ? (微|w(ei)?)\s*(信|x(in)?)

6.指定匹配位置:3種:

?^字符串開頭顷帖,比如: 字符串開頭的空字符:^\s+

?$字符串結(jié)尾,比如: 字符串結(jié)尾的空字符:\s+$

? ? ? ? ? ? ? ? 比如: 開頭或結(jié)尾的空字符:^\s+|\s+$

?\b單詞邊界:包括: ?^$ 空格 標(biāo)點(diǎn)符號渤滞,比如: 查找單詞no贬墩,匹配單詞no:?\bno\b

純英文格式電子郵件: var reg = /^[0-9A-Za-z_-]+@[0-9A-Za-z_-]+(\.[0-9A-Za-z_-]+)+$/

銀行卡: 借記卡、儲(chǔ)蓄卡19位妄呕, 貸記卡陶舞、信用卡16位, 存折17位

? \B?非單詞邊界

var reg = /([a-z])\1*/ig;?? //定義正則表達(dá)式變量

var reg =new RegExp("^[a-zA-Z]{9,20}$");

var kw = str.match(reg);? ? //使用此變量時(shí)绪励,不需使用斜杠

判斷是否是圖片(帶參數(shù)):? /\.(png|jpe?g|gif|svg)(\?.*)?$/.test(str)

判斷是否是視頻(帶參數(shù)):? /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/.test(str)

_______________________________________________________________________________________________

/([a-z])\1*/ ? ? ? ?//表示: ?第一位必須是小寫字母肿孵,\1表示匹配和第一個(gè)()中完全相同的內(nèi)容

? ? ? ? ? ? ? ? ? ? ? ? ? ?? *表示可有可無,多了不限疏魏,就算沒有和它匹配的也選擇它

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?+表示至少一個(gè)停做,多了不限,有一個(gè)和它匹配的才選擇它

當(dāng) ? 緊跟在任何一個(gè)其他限制符(* ?+ ?? ?{n} ?{n,}? {n,m})后面時(shí)大莫,匹配模式是非貪婪的蛉腌,會(huì)盡可能少的匹配所搜索的字符串

默認(rèn)的貪婪模式則盡可能多的匹配所搜索的字符串

? ? 例如: ?對于字符串"oooo","o+"將盡可能多的匹配"o",得到結(jié)果 ['oooo']只厘,而 "o+?"?將盡可能少的匹配"o"烙丛,得到結(jié)果 ['o','o','o','o']

m? 多行,將開始和結(jié)束字符(^和$)視為在多行上工作懈凹,也就是分別匹配每一行的開始和結(jié)束(由 \n 或 \r 分割)蜀变,而不只是只匹配整個(gè)輸入字符串的最開始和最末尾處

s? 與m相反,單行匹配

第七章*****************************************************************************************

四介评、RegExp類型

什么是: 專門封裝一條正則表達(dá)式,并提供使用正則表達(dá)式執(zhí)行查找和驗(yàn)證的API

何時(shí): 1. 使用正則表達(dá)式驗(yàn)證用戶輸入的字符串格式

? ? ? 2. 即查找關(guān)鍵詞內(nèi)容爬舰,又查找關(guān)鍵詞位置

如何:

創(chuàng)建: 2種

① 直接量(字面量)

var reg=/正則/ig;? ? ? ? ? ?? //i: 忽略(ignore)大小寫们陆;g: 查找全部(global)

何時(shí): 如果正則表達(dá)式是固定不變的

強(qiáng)調(diào): //之中不支持js表達(dá)式,不支持動(dòng)態(tài)生成正則表達(dá)式情屹,如果再出現(xiàn)/坪仇,就必須改為\/

②?使用正則表達(dá)式的構(gòu)造函數(shù)

var reg=new RegExp("正則","ig");

如: var reg=new RegExp("^[a-zA-Z]","g")? ? ?//使用引號時(shí),不加斜杠

? ? var reg=new RegExp(/^[a-zA-Z]/,"gi")? ? //有斜杠時(shí)垃你,不加引號

何時(shí): 如果正則表達(dá)式需要?jiǎng)討B(tài)拼接生成

強(qiáng)調(diào): ""中再出現(xiàn)\或"椅文,都要改為\\和\"

API: 2個(gè)

① 即查找內(nèi)容喂很,又查找位置

var arr=reg.exec(str) ? ? ? ? /*在str中依次查找下一個(gè)符合reg規(guī)則的關(guān)鍵詞的內(nèi)容和位置*/

返回值: 返回一個(gè)數(shù)組arr: 與正則表達(dá)式匹配的文本,后面依次為各個(gè)子表達(dá)式()的文本皆刺,用逗號分隔

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?最后一個(gè)arr["input"] 是要查找的內(nèi)容str

? ? ? ?arr[0]本次找到的關(guān)鍵詞的內(nèi)容

? ? ? ?arr["index"]本次找到的關(guān)鍵詞的下標(biāo)位置

? ? ? ? 如果沒找到少辣,就返回null

問題: 每次只返回本次找到的一個(gè)關(guān)鍵詞

解決: 用循環(huán)反復(fù)調(diào)用reg.exec

原理: 每次調(diào)用exec,做3件事:

? ?? 1. 將本次找到的關(guān)鍵詞保存在arr的0位置

? ?? 2. 將本次找到的關(guān)鍵詞位置保存在arr的index位置

? ?? 3. 每個(gè)reg對象都有一個(gè).lastIndex屬性, 標(biāo)識下次開始的查找位置羡蛾,開始時(shí)為0

? ? ? ? 每執(zhí)行完一次exec漓帅,exec會(huì)自動(dòng)修改為:?reg.lastIndex=當(dāng)前位置index+關(guān)鍵詞長度

function cha(str){

? var? reg=/./g; ? ? ? ? ? ? ? ? ? ? //在全局查找關(guān)鍵詞

? for(var i=0;i<str.length;i++){ ? ? //str.length: 字符串的長度

? ? var arr=reg.exec(str);

? ? console.log(arr[0]); ? ? ? ? ? ? //關(guān)鍵詞的內(nèi)容

? ? console.log(reg.lastIndex-1);? ? //關(guān)鍵詞的下標(biāo)位置

}?}

② 驗(yàn)證字符串的格式

var bool=reg.test(str);? ? ? ? ? ? ? ?/*驗(yàn)證str是否符合reg的規(guī)則要求*/

驗(yàn)證通過返回true,不通過返回false痴怨,可直接當(dāng)做判斷條件

問題: test默認(rèn)只要部分匹配就返回true

解決:從頭到尾完全匹配(驗(yàn)證)忙干,必須在正則表達(dá)式中: 前加^,后加$

_______________________________________________________________________________________________

五浪藻、Math類型

什么是: 專門保存數(shù)學(xué)計(jì)算的常量和函數(shù)的對象 的API

何時(shí): 只要進(jìn)行數(shù)學(xué)計(jì)算

如何:

創(chuàng)建: Math不用創(chuàng)建捐迫,不能new,直接使用

? ?? 所有常量和API都用Math直接調(diào)用

API

取整: 3種:

1.上取整: 只要超過爱葵,就取下一個(gè)整數(shù)

Math.ceil(num)

2.下取整: 只要超過施戴,就省略小數(shù)部分

Math.floor(num)

Math.floor(num) ? VS ? parseInt(str)

只能對純數(shù)字 ? ? ? ? ? 能先去掉數(shù)字之后的非數(shù)字字符,再取整

3.四舍五入取整

Math.round(num)

Math.round ? ? ? ? ? ? ?? VS ? ? ? ? ?? n.toFixed(d)

缺: 只能取整,不能指定小數(shù)位數(shù) ? ? ?? 優(yōu): 可指定任意小數(shù)位數(shù)四舍五入

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?金錢: Number(parseFloat(num).toFixed(2))

優(yōu):?將返回number,可直接計(jì)算? ? ? ? ? 缺: 將返回字符串類型钧惧,需要先轉(zhuǎn)換為數(shù)字類型暇韧,再計(jì)算

可自定義round函數(shù)

4. 乘方和開平方

Math.pow(底數(shù),冪); ?? 乘方

Math.sqrt(n); ? ? ? ? 開平方

5. 最大值和最小值

Math.max(值1,值2,值3,...)

Math.min(值1,值2,值3,...)

問題: max/min不支持獲得數(shù)組中的最大/小值,求出數(shù)組中的最大/最小值

解決:Math.max.apply(null,arr)? ? ? ? ?/*apply: 調(diào)用浓瞪,可自動(dòng)打散數(shù)組類型參數(shù)*/

6. 隨機(jī)數(shù)

Math.random() ? ? ? ?? 取值: 0~1懈玻,默認(rèn)得到一個(gè)隨機(jī)小數(shù)

公式:在任意[min,max]之間生成一個(gè)隨機(jī)整數(shù):var r=parseInt(Math.random()*(max-min+1)+min)

簡寫: 如果min=0,即[0, max]之間: var r=parseInt( Math.random()*(max+1) )

例: 隨機(jī)數(shù)組中的數(shù):var index = parseInt(Math.random()*arr.length)

_______________________________________________________________________________________________

六乾颁、Date類型

什么是: 專門封裝一個(gè)時(shí)間點(diǎn)涂乌,并提供操作時(shí)間的API

何時(shí): 只要存儲(chǔ)時(shí)間或者計(jì)算時(shí)間

如何:

創(chuàng)建: 4種

1. 創(chuàng)建日期對象,并自動(dòng)獲得當(dāng)前系統(tǒng)時(shí)間

var now=new Date();//強(qiáng)調(diào): 只能獲得客戶端本地時(shí)間英岭,標(biāo)準(zhǔn)格式,即格林尼治標(biāo)準(zhǔn)時(shí)(GMT)

2. 創(chuàng)建日期對象湾盒,并封裝自定義時(shí)間點(diǎn)

var date=new Date("yyyy/MM/dd hh:mm:ss");? /*字符串中的月份為自動(dòng)-1后的值*/

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? //時(shí)間格式也可為: '2017-12-30 21:15:00'

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? //或: 2018-03-06T17:12(部分瀏覽器有時(shí)差問題)

部分手機(jī)(如iPhone)獲取時(shí)間的方式與其它瀏覽器不同,需要兼容處理:

new Date("2017-02-05 12:10:10.12")可能會(huì)發(fā)生錯(cuò)誤诅妹,函數(shù)返回錯(cuò)誤是"Invalid Date"

var str = "2018-04-13 22:45:00";

var arr = str.split(/[- : \/]/);

var date = new Date(arr[0], arr[1]-1, arr[2], arr[3], arr[4] || '00', arr[5] || '00');

因?yàn)閕OS不能識別 - 形式罚勾,也可以替換為斜杠形式:

date = date.replace(/-/g, '/');? ? // 2018/06/03 00:00:00

若不是字符串: var date=new Date(yyyy, MM-1,dd,hh,mm,ss);

如果只關(guān)心日期,不關(guān)心時(shí)間吭狡,后半部分時(shí)分秒可省略尖殃。省略后,默認(rèn)是00:00:00

3. 用毫秒數(shù)創(chuàng)建日期對象

原理: 日期對象中保存的是1970年1月1日0點(diǎn)至今的毫秒數(shù)———整數(shù)

為什么: 時(shí)間段划煮,不受時(shí)區(qū)影響

? ? ?? 相同的毫秒數(shù): 在不同時(shí)區(qū)可顯示不同的時(shí)間點(diǎn)

總結(jié): 將來數(shù)據(jù)庫中保存的時(shí)間都是毫秒數(shù)送丰,不要用文字

何時(shí): 只要將毫秒數(shù)轉(zhuǎn)化為當(dāng)?shù)貢r(shí)間格式時(shí)

var ms=date.getTime(); ? ? ? ? ? /*將標(biāo)準(zhǔn)格式的date轉(zhuǎn)化為毫秒數(shù) ms*/

var now=new Date().getTime();? //獲取客戶端1970年1月1日0點(diǎn)至今的毫秒數(shù)(縮寫),時(shí)間戳

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//注意時(shí)區(qū)問題

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// +new Date()弛秋、Date now()? ? 返回毫秒數(shù)

var date1=new Date(ms); //將毫秒數(shù)?ms 轉(zhuǎn)化為操作系統(tǒng)當(dāng)前所在時(shí)區(qū)的對應(yīng)時(shí)間(必須是Number類型)

4. 復(fù)制一個(gè)日期對象:

為什么: 日期的計(jì)算只能直接修改原日期對象

后果: 計(jì)算后器躏,無法保存計(jì)算前的原日期

何時(shí): 如果用戶希望同時(shí)保留計(jì)算前后的開始時(shí)間和結(jié)束時(shí)間時(shí)俐载,都要先將開始時(shí)間復(fù)制一份,再用副本計(jì)算結(jié)束時(shí)間

如何:

var date2=new Date(date1);

_______________________________________________________________________________________________

API: 3句話:

1. 8個(gè)單位: FullYear年 ? Month月 ? Date日 ? ? Day星期 ? ? ? ? ? ?———沒有s

? ? ? ? ? ?Hours小時(shí)? Minutes分鐘 ?Seconds秒 ?Milliseconds毫秒 ? ———都以s結(jié)尾

2. 每個(gè)單位都有一對兒getXXX()/setXXX()方法

? ?getXXX()? ?負(fù)責(zé)獲得指定單位上的數(shù)值

??setXXX(n) ?? 負(fù)責(zé)修改指定單位上的數(shù)值登失,可自動(dòng)調(diào)整時(shí)間進(jìn)制

?? 特例: Day(星期)沒有setXXX()方法

3. 取值范圍:除date(從1開始,31結(jié)束)外遏佣,其余都是從 0 開始到進(jìn)制減 1 結(jié)束

?? FullYear: ? ? ? ? ? ? ? ? ? 和現(xiàn)實(shí)中年份一致

?? Month: 0~11 ? ? ? ? ? ? ?? 現(xiàn)實(shí)中: 1~12,計(jì)算機(jī)中的月份值比現(xiàn)實(shí)中少1,需要修正

?? Date: 1~31 ? ? ? ? ? ? ? ? 和現(xiàn)實(shí)一樣

?? Day: 0~6 ? ? ? ? ? ? ? ? ? 現(xiàn)實(shí): 日~六,和現(xiàn)實(shí)中一致

?? Hours: 0~23 ? ? ? ? ? ? ? ?和現(xiàn)實(shí)一樣

?? Minutes/Seconds: 0~59 ? ? ?和現(xiàn)實(shí)一樣

_______________________________________________________________________________________________

日期計(jì)算

1. 兩日期對象可相減: 結(jié)果是毫秒差(ms)壁畸,可用于倒計(jì)時(shí)

2. 對任意單位做加減:3步:

? ①取值: var date1=now.getDate();

? ②做加減: date1+=30;

? ? ? ? ? ? ?例如: 16+30=46

? ③放回去: now.setDate(date1); ? ? ? ? ? ?/*setDate可自動(dòng)調(diào)整進(jìn)制*/

簡寫:now.setDate(now.getDate()+n);

問題: setDate直接修改原日期對象贼急,無法保留開始時(shí)間

解決: 在計(jì)算前,都要先將開始時(shí)間復(fù)制一個(gè)副本捏萍,再用副本計(jì)算結(jié)束時(shí)間

倒計(jì)時(shí):

now/=1000, end/=1000;

放在定時(shí)器中:

now++;

varT?= parseInt((end-now)/1000);? ? ?//共剩多少時(shí)間(單位:秒)

var d = parseInt(T/(3600*24));? ? ? ? //剩多少天

var h = parseInt(T%(3600*24)/3600);? ?//剩多少小時(shí)

var m = parseInt(T%(3600)/60);? ? ? ? //剩多少分鐘

var s =T%60;? ? ? ? ? ? ? ? ? ? ? ? ?//剩多少秒

日期格式化(new Date()系統(tǒng)時(shí)間,轉(zhuǎn)字符串)

date.toString() ? ? ? ? ? ? ? 返回當(dāng)?shù)貢r(shí)間格式的完整版本(系統(tǒng)時(shí)間格式)

date.toLocaleString() ? ? ? ? 返回當(dāng)?shù)貢r(shí)間格式的簡化版本(有時(shí)分秒)太抓,不同平臺有可能不一樣

date.toLocaleDateString() ? ? 僅保留了日期部分

date.toLocaleTimeString() ? ? 僅保留了時(shí)分秒部分

date.toGMTString() ? ? ? ? ? ?獲得 0 時(shí)區(qū)的國際標(biāo)準(zhǔn)時(shí)間

_______________________________________________________________________________________________

new Date($.ajax({async: false}).getResponseHeader("Date")); ? ?//獲取服務(wù)器相應(yīng)頭附帶的時(shí)間

輸出客戶端時(shí)間:

var weeks=["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];

function fillTime(time){?return time>=10?time:"0"+time;?} ? ?//補(bǔ)全時(shí)間

var now = new Date();

var day = now.getDay();

var year ? ?=?now.getFullYear();? ? ? ? ? ? ?//年份

var month ? = fillTime(now.getMonth()+1);? ? //月份

var date ? ?= fillTime(now.getDate());? ? ? ?//日期

var hours ? = fillTime(now.getHours());? ? ? //小時(shí)

var minutes = fillTime(now.getMinutes());? ? //分鐘

var seconds = fillTime(now.getSeconds());? ? //秒

var dateTime=year+'-'+month+'-'+date+' '+hours+':'+minutes+':'+seconds+'('+weeks[day]+')';

console.log(dateTime); ? ?//2017-09-02 13:21:06(星期六)

const formatNumber = n =>{

? n = n.toString()

? return n[1] ? n : '0' + n

}

const formatTime = date =>{

? const year = date.getFullYear()

? const month = date.getMonth() + 1

? const day = date.getDate()

? const hour = date.getHours()

? const minute = date.getMinutes()

? const second = date.getSeconds()

? return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')

}

獲取相鄰的一段天數(shù):

var base = +new Date(2018, 1, 1);? ? ? ? //獲取時(shí)間的毫秒數(shù)

var oneDay = 24 * 3600 * 1000;

for (var i = 0; i < 500; i++){

? var now = new Date(base += oneDay);

? date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));

}

UTC時(shí)間和GMT(本地)時(shí)間之間的轉(zhuǎn)換:

GMT轉(zhuǎn)為UTC:

var now = new Date();

var nowUTC = new Date(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate(),

? ? ? ? ? ? ? ? ? ? ? now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds());

UTC轉(zhuǎn)為GMT:

var nowGMT = Date.UTC(nowUTC.getFullYear(), nowUTC.getMonth(), nowUTC.getDate(),

? ? ? ? ? ? ? ? ? ? ? nowUTC.getHours(), nowUTC.getMinutes(), nowUTC.getSeconds());

var now = new Date(nowGMT)

注:?以北京時(shí)間為準(zhǔn),UTC總是比GMT小8個(gè)小時(shí)

常用API***************************************************************************************

Math.atan(n) ? ? ? ? ? ? ? //返回'反正切函數(shù)'arctan(n)的值令杈,單位弧度走敌,可轉(zhuǎn)換為角度

? 例: (Math.atan(a/b))*180/Math.PI

Math.abs(x) ? ? ? ? ? ? ? ?//返回?cái)?shù)字的絕對值

? 例: Math.abs(a) || 1;

Math.min(x,y) ? ? ? ? ? ? ?//返回指定的數(shù)字中帶有最低值的數(shù)字

stringObject.substr(start,length) ?? //從字符串中抽取從start下標(biāo)開始的指定數(shù)目(length)的字符

+str+1 ? ? ? ? ?//+可使字符串變?yōu)閿?shù)字類型再計(jì)算

x=Number(x); ? ?//手動(dòng)將字符串類型的數(shù)字轉(zhuǎn)換成Number類型,不直接修改原變量的值逗噩,而是返回新值

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掉丽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子异雁,更是在濱河造成了極大的恐慌捶障,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纲刀,死亡現(xiàn)場離奇詭異项炼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)示绊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門锭部,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人面褐,你說我怎么就攤上這事拌禾。” “怎么了展哭?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵湃窍,是天一觀的道長。 經(jīng)常有香客問我匪傍,道長坝咐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任析恢,我火速辦了婚禮,結(jié)果婚禮上秧饮,老公的妹妹穿的比我還像新娘映挂。我一直安慰自己泽篮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布柑船。 她就那樣靜靜地躺著帽撑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鞍时。 梳的紋絲不亂的頭發(fā)上亏拉,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音逆巍,去河邊找鬼胧弛。 笑死饭寺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播最冰,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼边翁!你這毒婦竟也來了奴艾?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤翎迁,失蹤者是張志新(化名)和其女友劉穎栋猖,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汪榔,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒲拉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了揍异。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片全陨。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖衷掷,靈堂內(nèi)的尸體忽然破棺而出辱姨,到底是詐尸還是另有隱情,我是刑警寧澤戚嗅,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布雨涛,位于F島的核電站,受9級特大地震影響懦胞,放射性物質(zhì)發(fā)生泄漏替久。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一躏尉、第九天 我趴在偏房一處隱蔽的房頂上張望蚯根。 院中可真熱鬧,春花似錦胀糜、人聲如沸颅拦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽距帅。三九已至右锨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碌秸,已是汗流浹背绍移。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讥电,地道東北人蹂窖。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像允趟,于是被迫代替她去往敵國和親恼策。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)潮剪,也就是一...
    悟名先生閱讀 4,145評論 0 13
  • 前言 最先接觸編程的知識是在大學(xué)里面抗碰,大學(xué)里面學(xué)了一些基礎(chǔ)的知識狮斗,c語言,java語言弧蝇,單片機(jī)的匯編語言等碳褒;大學(xué)畢...
    oceanfive閱讀 3,068評論 0 7
  • --- 學(xué)習(xí)目標(biāo): - 掌握編程的基本思維 - 掌握編程的基本語法 typora-copy-images-to: ...
    YFBigHeart閱讀 1,051評論 0 2
  • 君姐又搬家了。之所以是“又”看疗,是因?yàn)檫@一次只是君姐二十余次搬家中的一次沙峻。回望君姐走過的這近二十年的教育生涯两芳,用“驚...
    燕語詩心閱讀 413評論 1 1
  • “生得好摔寨,不如嫁得好〔懒荆”這句話是复,不知道從什么時(shí)候開始一直在我耳邊環(huán)繞。 畢業(yè)前竖螃,我忙著找工作投簡歷淑廊,我身邊的朋友已...
    姬櫻閱讀 2,517評論 6 1