正課:
1. 正則:
指定匹配位置
2. ***String API:
替換: 衍生: 刪除和格式化
切割
3. ***RegExp對象
1. 正則:
指定匹配位置: 三個位置:
字符串的開頭 ^
字符串的結尾 $
比如: 開頭的空字符: ^\s+
結尾的空字符: \s+$
開頭或結尾的空字符^\s+|\s+$
固定套路: 只要希望字符串和正則從頭到尾完全匹配
比如同時前加^後加$
只要用正則表達式執行驗證時,必須前加^後加$
單詞邊界 \b 包含: ^ $ 空格 標點
比如: 單詞首字母: \b[a-z]
單詞尾字母: [a-z]\b
單獨的一個單詞no: \bno\b
2. ***StringAPI
替換: 簡單替換: str=str.replace(/正則/ig, "替換值");
問題: 不能根據不同的關鍵詞,選擇不同的值替換
解決: 高級替換:
str=str.replace(/正則/ig,function(kw){
//kw會自動獲得本次找到的關鍵詞內容
return //根據不同kw,返回不同的替換值
})
何時: 只要根據不同的關鍵詞,替換不同內容時
衍生:
刪除: 將關鍵詞替換爲""
格式化: 將原字符串重新拼接爲新的格式
比如: "19831226" => "1983年12月26日"
2步: 1. 正則將原字符串分組
/(\d{4})(\d{2})(\d{2})/
// 1 2 3
2. 使用簡單替換: str.replace(/正則/,"...$n...")
$n可自動獲得第n個分組的子內容
n從1開始
切割: 將原字符串,按指定字符,分隔爲多個子字符串
如何: var substrs=str.split(/正則/)
返回切割後的多個子字符串組成的數組
結果中,不再包含分隔符
固定套路: 將字符串打散成字符數組: var chars=str.split("")
3. ***RegExp:
什麼是: 封裝一條正則表達式, 提供了使用正則表達式進行查找和驗證的API
何時: 1. 查詢關鍵詞的第四種情況: 即查內容,又查位置
2. 利用正則表達式執行驗證
如何:
創建: 2種:
1. 如果正則表達式是固定不變的: var reg=/正則/ig;
強調: /正則/中正則中的/都要轉義爲\/
2. 如果正則表達式是動態生成的:
var reg=new RegExp("正則"[,"ig"]);
強調: "正則"中的" \ 都要轉義爲\" \\
比如: "\d{6}" => "\\d{6}"
1. ***RegExp:
2. Math
3. ***Date
1. ***RegExp
API:
驗證: 檢查字符串是否完全符合正則表達式的要求!
如何: var bool=reg.test(待檢測字符串)
強調: 只要驗證,reg中必須前加^後加$
查找關鍵詞: 第四種情況: 即找內容,又找位置
如何: var arr=reg.exec(待查找的完整字符串)
在"待查找的完整字符串"中,依次查找每個符合reg要求得關鍵詞。
返回值: 本次找到的一個關鍵詞及其位置
arr[0]: 關鍵詞內容
如果正則中有分組
arr[n]: 自動保存第n個分組匹配的子內容
arr["index"]: 當前關鍵詞位置 -> 可簡寫爲arr.index
如果沒找到,返回null
每次查找後,都將reg.lastIndex屬性(下次開始位置)修改爲當前index+關鍵詞長度,相當跳過當前關鍵詞繼續向後找
固定套路: 找所有關鍵詞:
while((arr=reg.exec(str))!=null){
arr[0] 關鍵詞內容
arr[n] 自動獲得第n個分組的子內容
arr.index 當前關鍵詞位置
}
如果只需要分組的子字符串,不需要完整關鍵詞:
可省略arr,用RegExp.$n
while(reg.exec(str)!=null){
RegExp.$n 自動獲得第n個分組的子內容
}
練習:
貪婪模式: 正則表達式默認匹配最長的符合條件的子字符串
默認使用貪婪模式
.* .+
懶惰模式: 僅匹配最短的符合條件的子字符串
貪婪->懶惰: .*? .+?
2. Math:
什麼是: 專門封裝數學計算所用常量,並提供數學計算所用API
何時: 只要數學計算時
特點: 不能new!
API:
1. 取整:
Math.ceil(num) 上取整: 只要超過,就取下一個整數
Math.floor(num) 下取整: 省略小數部分
Math.round(num) 四捨五入取整:
vs toFixed(d):
1. 小數位數: Math.round()只能取整,不能規定小數位數
toFixed(d)可取整,也可規定小數位數
2. 返回值: Math.round()返回number
toFixed(d)返回string
自定義round函數:
2. 乘方和開平方:
乘方: Math.pow(底數, 冪)
開平方: Math.sqrt(n)
3. 最大值和最小值:
Math.max(值1,值2,...);
Math.min(值1,值2,...);
問題: 不支持數組
解決: Math.max.apply(null,arr)
4. 隨機數:
Math.random() 0<=r<1 隨機小數
從min~max之間取隨機整數:
Math.floor(Math.random()*(max-min+1)+min)
從0~n之間去隨機:
Math.floor(Math.random()*(n+1));
3. ***Date
什麼是: 封裝一個時間,提供操作時間的API
何時: 只要存儲時間,都要用Date對象
如何:
創建: 4種:
1. 創建日期對象,並自動獲得當前客戶端系統時間
var now=new Date();
2. 創建日期對象,並封裝自定義時間:
var date=new Date("yyyy/MM/dd hh:mm:ss");
var date=new Date(yyyy,MM-1,dd,hh,mm,ss)
3. 複製一個日期對象:
問題: 日期對象的計算都是直接修改原日期對象
計算後無法保留計算前的舊時間
解決: 今後如果需要同時保留開始和結束時間時
都要先將開始時間複製一個副本,再用副本計算
var date1=new Date(...);
var date2=new Date(date1);
4. 用毫秒數創建日期對象:
Date對象的原理:
Date對象中保存了一個巨大的毫秒數
起始時間爲: 1970年1月1日0點至今的毫秒數
var date=new Date(ms);
兩個日期對象可相減: 得到毫秒差