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