標籤:obj for 迴圈 gets string logs 講解 函數返回 重複
在javascript中,字串的replace方法可以指定替換某些字串。
1、直接替換字串
"yy/MM/dd".replace("yy","2017");//替換後,原字串變為2017/MM/dd
這是直接指定將原字串中的yy替換為2017。
2、指定用函數傳回值替換原指定字串
"yy/MM/dd".replace("yy",function(){return "2017";});//替換後,原字串變為2017/MM/dd
這是用函數傳回值2017替換原字串中的yy。
3、用Regex指定需要被替換的源字串
"yy/MM/dd".replace(/yy/,"2017");
看了上面最簡單的,咱來一個比較複雜的。看下面的代碼:
Date.prototype.format = function(e) { var t = this, n = Date._formators; return n || (Date._formators = n = { y: function(e, t) { return e = e.getFullYear(), e < 0 ? "BC" + -e: t < 3 && e < 3e3 ? e % 100 : e }, M: function(e) { return e.getMonth() + 1 }, d: function(e) { return e.getDate() }, H: function(e) { return e.getHours() }, m: function(e) { return e.getMinutes() }, s: function(e) { return e.getSeconds() }, e: function(e, t) { return (t === 1 ? "": t === 2 ? "周": "星期") + [t === 2 ? "日": "天", "一", "二", "三", "四", "五", "六"][e.getDay()] } }), //這個逗號是用來幹啥的?為何括弧之間會有這個逗號? (e || "yyyy/MM/dd HH:mm:ss").replace(/(\w)\1*/g, function(e, r) {//這個function是怎麼來的 if (r in n) { r = "" + n[r](t, e.length); while (r.length < e.length) r = "0" + r; e = r } return e })}
上面這塊代碼對於新手來說,看著比較複雜,為啥括弧之間會有逗號?為啥Regex(\w)後會有\1*?replace函數的第二個參數function(e,r)是怎麼來的,為何這個function會有兩個參數,這兩個參數到底是什麼意思?估計這些是新手最想問的。別急,接下來會一一講解這些問題。
一、括弧之間為何會有逗號?
這個屬於逗號運算子。逗號運算子的的運算規則是自左向右運算,並返回最後一個運算式的值。
如:var data=(x=2,x*3,x*5);
上面這個運算式中,最先計算括弧裡面的值。括弧裡面的運算規則就是根據逗號運算子的規則去計算的,自左向右計算。首先計算x=2,第二個參數為6,第三個參數為10。data就是最後的一個參數值10。
二、Regex(\w)後面的\1*是什麼意思?
\1表示重複正則第一個圓括弧內匹配到的內容,\2表示重複正則第二個圓括弧內匹配到的內容,如果有嵌套的圓括弧,順序是按左括弧的次序計算的。星號*是匹配零個或多個。
即"yy/MM/dd".replace(/(\w)/,"1"),這個\w首先匹配字元y,則最終的結果為"1y/MM/dd",如果是"yy/MM/dd".replace(/(\w)\1/,"1"),則最終的結果是"11/MM/dd",\1就是多匹配一個(\w)這個參數。按照這樣來看,則"ybyb/MM/dd".replace(/(\w)(\w)\1\2/,"2")的結果為"2/MM/dd"。
三、replace函數的第二個參數function(e,r)是怎麼來的,為何這個function會有兩個參數,這兩個參數到底是什麼意思?
這個函數應該是replace函數裡面內建的,但是需要外面傳一個實體方法進去。e傳入的參數值為整個匹配的結果,如:yyyy。r傳入的參數為(\w)匹配的結果,如:y。如果在Regex後有g的話,那就是對整個字串進行匹配並替換,有多少個匹配就迴圈多少次替換操作。如下面的代碼所示:
var obj={ y:1, M:2, d:3};var source="yyyy/MM/dd".replace(/(\w)\1*/g,function(word,element){ if(element in obj){ word=obj[element].toString(); } return word;});document.write(source);//對Regex進行了迴圈匹配,所以結果為:1/2/3
javascript的replace之Regex的淺析