JS中with的替代方法與String中的正則方法詳解
with 語法
在代碼中,要執(zhí)行這么一個函數(shù)
function computeExpression(exp, scope) { try { with (scope) { return eval(exp); } } catch (e) { console.error('ERROR', e); } }
要求在scope 作用域中執(zhí)行,什么意思???
比如
scope = {a:10,b:5}; exp = a*b;
要求計算結(jié)果為15,這種情況,常規(guī)情況下要使用 with語法。
但是:
js的解釋器需要檢查with塊中的變量是否屬于with包含的對象,這將使with語句執(zhí)行速度大大下降,并且導(dǎo)致js語句很難被優(yōu)化。
在嚴(yán)格模式中,with語法是被禁用的。
而我使用ES6語法來編寫這個庫的,默認(rèn)啟用了嚴(yán)格模式了。所以不得已,自己模擬了一個with 的語法。
先看代碼
function replaceWith(scopeName, exp) { exp = " " + exp.trim(); let quickRegex = /([\s\+\-\*\/%&\|\^!\*~]\s*?)([a-zA-Z_$][a-zA-Z_$0-9]*?)/g; exp = exp.replace(quickRegex, (a, b, c) => { return b + scopeName + '.' + c; }); return exp; }
首先把首位的空格全部去掉,為了和后面的統(tǒng)一,在開頭加上一個空格。
第一個正則匹配出猶如"t.e==0 ? f : d"
的表達(dá)式中的變量會被作為c提取出來,符號作為 b提取出來。
測試一下
現(xiàn)在已經(jīng)可以返回一個表達(dá)式了,改裝一下,讓表達(dá)式直接在里面執(zhí)行
function replaceWith(scope, exp) { exp = " " + exp.trim(); let quickRegex = /([\s\+\-\*\/%&\|\^!\*~]\s*?)([a-zA-Z_$][a-zA-Z_$0-9]*?)/g; exp = exp.replace(quickRegex, (a, b, c) => { return b + 'scope.' + c; }); let func = new Function("scope", "return " + exp); return func(scope); }
測試一下
大功告成。
可能中間正則寫的不好,還有其他不嚴(yán)密的地方,歡迎園友補(bǔ)充。
String 原型上的正則方法
好久都沒怎么寫過大量代碼了,看到 Sring.prototype.split(//);
這個正則表達(dá)式,竟然把分割符號都給加到數(shù)組中了,很驚訝,在MDN上學(xué)了一下。順便做個整理,算是補(bǔ)充吧。
String.prototype.split(separator,[limit])
separator:指定用來分割字符串的字符(串)。separator 可以是一個字符串或正則表達(dá)式。 如果忽略 separator,則返回整個字符串的數(shù)組形式。如果 separator 是一個空字符串,則 str 將會把原字符串中每個字符的數(shù)組形式返回。
limit一個整數(shù),限定返回的分割片段數(shù)量。split 方法仍然分割每一個匹配的 separator,但是返回的數(shù)組只會截取最多 limit 個元素。
當(dāng)找到一個 seperator 時,separator 會從字符串中被移除,返回存進(jìn)一個數(shù)組當(dāng)中的子字符串。如果忽略 separator 參數(shù),則返回的數(shù)組包含一個元素,該元素是原字符串。如果 separator 是一個空字符串,則 str 將被轉(zhuǎn)換為由字符串中字符組成的一個數(shù)組。
注意:
Note: 當(dāng)字符串為空時,split 返回一個包含一個空字符串的數(shù)組,而不是一個空數(shù)組。
如果 separator 是一個正則表達(dá)式,且包含捕獲括號(capturing parentheses),則每次匹配到 separator 時,捕獲括號匹配的結(jié)果將會插入到返回的數(shù)組中。
var myString = "hello world"; var splits = myString.split((); console.log(splits);
輸出
["hello world"]
var myString = "Hello 1 word. Sentence number 2."; var splits = myString.split(/(\d)/); console.log(splits);
輸出
Hello ,1, word. Sentence number ,2,.
String.prototype.replace()
這個方法開始已經(jīng)用到,就不再介紹。
String.prototype.match(Regex)
當(dāng)字符串匹配到正則表達(dá)式(regular expression)時,match() 方法會提取匹配項。
如果正則表達(dá)式?jīng)]有 g 標(biāo)志,返回和 RegExp.exec(str)
相同的結(jié)果。而且返回的數(shù)組擁有一個額外的 input 屬性,該屬性包含原始字符串。另外,還擁有一個 index 屬性,該屬性表示匹配結(jié)果在原字符串中的索引(以0開始)。
"1aef2af3ef4 5".match(/[a-z]*(\d)/)
輸出
["1", "1"]
如果正則表達(dá)式包含 g 標(biāo)志,則該方法返回一個包含所有匹配結(jié)果的數(shù)組。如果沒有匹配到,則返回 null。
注意,如果加g, 則分組無用
"1aef2af3ef4 5".match(/[a-z]*(\d)/g)
輸出
["1", "aef2", "af3", "ef4", "5"]
String.prototype.search(Regex)
search()
方法執(zhí)行一個查找,看該字符串對象與一個正則表達(dá)式是否匹配。
如果匹配成功,則 search() 返回正則表達(dá)式在字符串中首次匹配項的索引。否則,返回 -1。
類似于正則表達(dá)式的 test 方法 。
"aeg56".search(/[a-z]\d+/)
輸出
2
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。
相關(guān)文章
JS表單驗(yàn)證方法實(shí)例小結(jié)【電話、身份證號、Email、中文、特殊字符、身份證號等】
這篇文章主要介紹了JS表單驗(yàn)證方法,結(jié)合實(shí)例形式總結(jié)分析了常用的表單驗(yàn)證技巧,包括電話、身份證號、Email、中文、特殊字符、身份證號等驗(yàn)證方法,需要的朋友可以參考下2017-02-02JavaScript實(shí)現(xiàn)密碼強(qiáng)度實(shí)時驗(yàn)證
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)密碼強(qiáng)度實(shí)時驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-03-03iframe自適應(yīng)寬度、高度 ie6 7 8,firefox 3.86下測試通過
近期需要一個iframe自適應(yīng)高度的東西,在網(wǎng)上找了很多,都不能用……一看大體的日期都是大概 2008年前后的其他近期的基本都是以前的轉(zhuǎn)載,所以只好自己動手了。2010-07-07微信小程序中選中手機(jī)相冊圖片上傳到服務(wù)器的步驟
這篇文章主要介紹了微信小程序中選中手機(jī)相冊圖片上傳到服務(wù)器的步驟,現(xiàn)圖片上傳我們需要使用chooseImg和uploadFile這兩個api,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2024-04-04