問(wèn)題來(lái)自一位叫小白的同事的疑問(wèn),問(wèn)題如下:
var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]"; str = str.replace(/[img_(S*)]/g,"");
或者
var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]"; var name = new RegExp("[img_(S*)]","g"); str = str.replace(name,"");
正則大神現(xiàn)身,這兩種寫法有什么區(qū)別?為什么結(jié)果不同?
無(wú)論怎么試都有問(wèn)題,首先上面的正則有點(diǎn)問(wèn)題,我們調(diào)整一下:
var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]"; var aa = /[img_(S*)]/g; var bb = new RegExp("[img_(S*)]","g"); var cc = ""; //方法1 str.replace(aa, cc); //方法2 str.replace(bb, cc);
結(jié)果一樣了,這就是一個(gè)正則的問(wèn)題
本來(lái)到這里就完了,可是小白還是很執(zhí)著的,為什么他寫的不行,他再次用正確的正則來(lái)測(cè)試,代碼貼出來(lái)如下:
顯然他之前也測(cè)試過(guò),只是用 replace 來(lái)做驗(yàn)證的,我測(cè)試也不通,就測(cè)試 new RegExp得出的結(jié)果是否一樣了,不知不覺,改了變量名來(lái)測(cè)試了,重復(fù)的東西別我提取,專門測(cè)試不一樣的地方,反而避免了這個(gè) name 變量名的問(wèn)題
var str = "[img_/storage/uploads/2016/1465955105.2148.jpg]"; var name = new RegExp("[img_(S*)]","g"); str = str.replace(name,"");
怎么會(huì)還是不行,這次正則絕對(duì)沒錯(cuò)了,都測(cè)試通過(guò)了
結(jié)果這次在控制臺(tái)測(cè)試,確實(shí)不通過(guò),咦為什么?
小白得出個(gè)暫時(shí)的結(jié)論:var 正則,不能用 name 來(lái)命名
這就奇怪了,哪有這樣的道理,你以為你是誰(shuí)啊,你又不是關(guān)鍵字、保留字,還不讓作為變量用了,憑什么不讓命名?還限制正則不讓用?
沒有這樣的道理,這時(shí)我才注意到 name 這個(gè)名字的特別處,我有個(gè)印象,name 是作為 window 的一個(gè)屬性在使用,作為當(dāng)前窗口(tab 頁(yè))的名稱,即使網(wǎng)站都跳轉(zhuǎn)走了,只要當(dāng)前窗口沒變,那么 name 值一直存在,不跟 url 相關(guān),這可以用來(lái)為跨域來(lái)用
這里難道有問(wèn)題,于是專一測(cè)試 name 這個(gè)特殊變量:
var name = new RegExp("[img_(S*)]","g"); //輸出 name //"/[img_(S*)]/g" 而 var bb = new RegExp("[img_(S*)]","g"); //輸出 bb //[img_(S*)]/g
在控制臺(tái)下調(diào)試,不細(xì)看就錯(cuò)過(guò)去了,差了分號(hào),上面的結(jié)果實(shí)際變成字符串了
奇怪啊,正則不行,變量類型都變了,我試試其他數(shù)據(jù)類型,
也是不行,但在閉包里可以了,這是 name 這個(gè)值作為特定屬性,被限制為“強(qiáng)數(shù)據(jù)類型”了,js 中一直沒有此概念,普通變量,我想什么類型就什么類型,賦值就可以了,這里一個(gè)大坑,真是不可料想,變量類型不可變(自動(dòng)轉(zhuǎn)為 String 類型)
還有其他變量是這樣的么,呵呵,這根本沒法預(yù)料,這個(gè)瀏覽器用這個(gè)名字,鬼知道那么多瀏覽器,誰(shuí)會(huì)不會(huì)偶爾又用了一個(gè)變量名字呢,他又有什么限制呢?。?!
舊事重提,一直說(shuō)盡量避免使用全局變量,今天又上了一課,如果不遵守,終會(huì)摔跟頭,而且死都不知道怎么死的,另外變量名稱真的不是隨便用的,良好的命名規(guī)范,能避免出現(xiàn)這種情況,和非意義的變量名aa, bb相比,name明顯有具體指代,指某名稱,作為一個(gè)正則表達(dá)式的值來(lái)用,確有不合理之處,名字不可以隨便叫啊。不過(guò)也正因?yàn)槿绱?,發(fā)現(xiàn)這個(gè)變量名原來(lái)還有這種限制。
我們當(dāng)前的開發(fā),幾乎不存在使用全局變量的情況了,全都使用閉包封裝了,能避免變量被污染(或者出現(xiàn)上面變量類型被限制的情況),但個(gè)別情況,簡(jiǎn)單頁(yè)面,還是存在不適用閉包把自己的變量全部包裝的情況,這是很可能出問(wèn)題
所以只要能用閉包包裝,盡量把自己的邏輯包裝起來(lái),免得再出現(xiàn)類似的詭異問(wèn)題
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82255.html
摘要:對(duì)于頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。通篇看完的話,基本上能避過(guò)很多坑記得微信文檔習(xí)慣把一些坑寫在后面,不放在一起先說(shuō)說(shuō),怎么微信怎么做二次分享文檔地址,通過(guò)引入官方。 對(duì)于H5頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟qq還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。和PC端不同,PC直接復(fù)制地址了。前兩天在做請(qǐng)柬,踩了不少的雷,個(gè)人開發(fā)和公司開...
摘要:對(duì)于頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。通篇看完的話,基本上能避過(guò)很多坑記得微信文檔習(xí)慣把一些坑寫在后面,不放在一起先說(shuō)說(shuō),怎么微信怎么做二次分享文檔地址,通過(guò)引入官方。 對(duì)于H5頁(yè)面來(lái)說(shuō)二次分享還是蠻重要的,畢竟qq還是微信發(fā)出去之后習(xí)慣性的使用自帶的分享功能。和PC端不同,PC直接復(fù)制地址了。前兩天在做請(qǐng)柬,踩了不少的雷,個(gè)人開發(fā)和公司開...
最近入職的公司主要做微信端的h5,所以在所難免要引用sdk。雖然官方文檔寫的還算清楚,但是還是有坑。 1.在index.html中 引入微信sdk 2.在assets/js 下新建文件 wx.js export default { wxShowMenu: function (that,sign=) { let url = window.location.href.split(#)[...
閱讀 2061·2023-04-25 16:19
閱讀 3158·2021-11-24 09:39
閱讀 867·2021-11-16 11:44
閱讀 1712·2019-08-29 12:52
閱讀 1163·2019-08-26 13:33
閱讀 1101·2019-08-26 10:26
閱讀 2231·2019-08-23 16:42
閱讀 2619·2019-08-23 14:37