一個(gè)奇怪的 Bug

一個(gè)奇怪的 Bug

非常感謝小趙同學(xué)給我反饋的這個(gè) Bug ????

在開始講解前先考考你們 Javascript 基礎(chǔ)摩钙,單看代碼你覺得它會輸出什么內(nèi)容?答案后面揭曉玩焰。

'Hello'.replace('ello', '#$&%')

話說某一天我突然收到一封郵件浅辙,一位同學(xué)跟我說我的站點(diǎn)炸代碼了物咳,嚇得我突然就從床上翻了個(gè)身——感覺充電線有點(diǎn)勒脖子我又翻了回去……

一波詳詢過后我了解到是我的自建博客站點(diǎn)寞宫,也就是現(xiàn)在在寫文章的這個(gè),它在某個(gè)頁面上會顯示一部分代碼在頁面的下方伊群。像這樣:

現(xiàn)象

心情突然就不好了——死去的 Bug 突然又回來攻擊我了拷获。篮撑。

這個(gè)問題其實(shí)之前出現(xiàn)過,但我后來給修好了匆瓜,今天又出現(xiàn)了我第一時(shí)間就抓緊復(fù)現(xiàn)赢笨,但發(fā)現(xiàn)我自己訪問好像沒啥問題,定位到最后發(fā)現(xiàn)是我的服務(wù)端的渲染腳本的問題驮吱。所以如果你是直接進(jìn)入站點(diǎn)再瀏覽文章是不會遇到的茧妒,多半我之前就是這樣才以為它修復(fù)了吧。復(fù)現(xiàn)的方式也很簡單:你得直接由某個(gè)鏈接進(jìn)入到某一篇博文才會觸發(fā)左冬,這就很有意思啦桐筏!基本可以說明它是由于數(shù)據(jù)的原因才會觸發(fā)的。

因?yàn)槲疫@個(gè)服務(wù)端渲染是自己用 Express 寫的拇砰,不是用的現(xiàn)成的框架梅忌,所以有的地方可能是會有問題的也正常狰腌。在一波探索之后定位到一處代碼塊,調(diào)試的結(jié)果非常奇怪牧氮。大致就是:

// 我的頁面模板
const template = fn();

// 渲染出來的頁面樣式
const css = fn();

// 當(dāng)前訪問頁面所用到的 React state
const state = fn();

// 將所有內(nèi)容由不同的錨點(diǎn)定位琼腔,替換到模板中去,每個(gè)錨點(diǎn)有且只有一個(gè)
const page = template
  .replace('css anchor', css)
  .replace('state anchor', state)

console.log(template.includes('state anchor'))
// true
console.log(page.includes('state anchor'))
// true
console.log(state.includes('state anchor'))
// false

見鬼了踱葛!頁面中的描點(diǎn)在替換后還是存在丹莲?然后我就在后面又給加了另外一條測試:

const page = template
  .replace('css anchor', css)
  .replace('state anchor', state)
  .replace('state anchor', 'f*** me')

console.log(template.includes('state anchor'))
// true
console.log(page.includes('state anchor'))
// false
console.log(state.includes('state anchor'))
// false

就挺奇怪的,我再替換了一次它就舒服了不見了尸诽。甥材。接著我順著描點(diǎn)替換的位置找去,最終發(fā)現(xiàn)它在某段文本中的這個(gè)位置:

" Use <Space-E> to open explorer
" Using Coc-explorer
noremap <space>e :CocCommand explorer<CR>
" Close Coc-explorer if it is the only window
autocmd BufEnter * if (&ft == 'coc-explorer' && winnr("$") == 1) | q | endif

這段是我之前講 Vim 和 Coc 的文章性含。重點(diǎn)注意這個(gè) winnr("$")洲赵,由于頁面在渲染中做了轉(zhuǎn)義處理,所以拿到的數(shù)據(jù)其實(shí)是 &quot;$&quot;. 也就是兩個(gè)引號給替換成 &quot; 了商蕴。而我上面用的是 replace 去替換的內(nèi)容板鬓。而在 replace 方法的替換文本中你猜怎么著?$& 代表的是匹配內(nèi)容本身究恤!所以我的實(shí)際替換結(jié)果會是:winnr(&quot;f*** mequot;)...

開始講解咯 ~

其實(shí) Javascript 中字符串的 replace 函數(shù),在傳入?yún)?shù)為字符串時(shí)是有特定的轉(zhuǎn)義字符(變量名)的后德。比如上面的部宿,如果你寫 '$&' 那它就會把你的查找符給替換進(jìn)去。類似的還有其他一些:

$$
是插入一個(gè) "$"瓢湃。

$&
是插入匹配的子串理张。

$`
是插入當(dāng)前匹配的子串左邊的內(nèi)容。

$'
是插入當(dāng)前匹配的子串右邊的內(nèi)容绵患。

$n
假如第一個(gè)參數(shù)是 RegExp 對象雾叭,并且 n 是個(gè)小于 100 的非負(fù)整數(shù),
那么插入第 n 個(gè)括號匹配的字符串落蝙。提示:索引是從 1 開始织狐。如果不存在第 n 個(gè)分組,
那么將會把匹配到到內(nèi)容替換為字面量筏勒。比如不存在第 3 個(gè)分組移迫,就會用“$3”替換匹配到的內(nèi)容。

$<Name>
這里 Name 是一個(gè)分組名稱管行。如果在正則表達(dá)式中并不存在分組(或者沒有匹配)厨埋,
這個(gè)變量將被處理為空字符串。只有在支持命名分組捕獲的瀏覽器中才能使用捐顷。

當(dāng)然你也可以不傳字符串傳函數(shù)進(jìn)去荡陷。這就不展開了雨效,可以到這里仔細(xì)了解:MDN - String.prototype.replace()

換到實(shí)際情況就是因?yàn)槲也迦霠顟B(tài)的錨點(diǎn)是個(gè) script 標(biāo)簽,所以 Html 的內(nèi)容就給截?cái)嗔朔显蕖8缯竟簦╔SS)的原理有點(diǎn)像吧徽龟,所以它才只是頁面下方出現(xiàn)了被斷開的代碼塊而正文的顯示是正常的。

知道是什么問題就好修了嘛蛹头!自己寫一個(gè)不會被任何字符串轉(zhuǎn)義的替換函數(shù)就好了嘛顿肺。

具體怎么寫你可以自己想想看 ??

然后就是開篇的問題,現(xiàn)在知道答案是什么了嗎渣蜗?

'Hello'.replace('ello', '#$&%')
// 'H#ello%'

好了今天就聊到這兒了~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屠尊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子耕拷,更是在濱河造成了極大的恐慌讼昆,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骚烧,死亡現(xiàn)場離奇詭異浸赫,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赃绊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門既峡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碧查,你說我怎么就攤上這事运敢。” “怎么了忠售?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵传惠,是天一觀的道長。 經(jīng)常有香客問我稻扬,道長卦方,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任泰佳,我火速辦了婚禮盼砍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逝她。我一直安慰自己衬廷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布汽绢。 她就那樣靜靜地躺著吗跋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跌宛,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天酗宋,我揣著相機(jī)與錄音,去河邊找鬼疆拘。 笑死蜕猫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哎迄。 我是一名探鬼主播回右,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼漱挚!你這毒婦竟也來了翔烁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤旨涝,失蹤者是張志新(化名)和其女友劉穎蹬屹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體白华,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慨默,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弧腥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厦取。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖管搪,靈堂內(nèi)的尸體忽然破棺而出蒜胖,到底是詐尸還是另有隱情,我是刑警寧澤抛蚤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站寻狂,受9級特大地震影響岁经,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛇券,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一缀壤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纠亚,春花似錦塘慕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春蛤织,著一層夾襖步出監(jiān)牢的瞬間赴叹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工指蚜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乞巧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓摊鸡,卻偏偏與公主長得像绽媒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子免猾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容