第五章*****************************************************************************************
什么是索引數(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類型,不直接修改原變量的值逗噩,而是返回新值