字符串拼接引發(fā)的BUG

譯者按: bug雖小,卻是個磨人的小妖精晾捏!

為了保證可讀性蒿涎,本文采用意譯而非直譯。另外惦辛,本文版權(quán)歸原作者所有劳秋,翻譯僅用于學(xué)習(xí)。

這是一篇很簡短的博客胖齐,記錄了我今天早上花了一個小時才解掉的一個bug玻淑。

準(zhǔn)備工作

在已有的網(wǎng)站頁面,我們已經(jīng)有一段JavaScript代碼用于構(gòu)建字符串并把它插入到DOM中呀伙,如下所示:

function GetTemplate(url, html)  
{
   // 省掉部分細節(jié)代碼
   // ...
   var template = '<div class="something"><a href="'
                  + url
                  + '" target="_blank"><strong>Details: </strong><span>'
                  + html
                  + '</span></a></div>';
  return template;
}

請忽略這段代碼的粗糙补履。接下來,我們的需求很簡單:如果summary存在区匠,那么在<strong>標(biāo)簽前面添加一個額外的<span>標(biāo)簽將該值顯示出來干像。是不是很簡單?我們來試一試驰弄。

首次嘗試

我快速實現(xiàn)了如下代碼:

function GetTemplate(url, html, summary) {  
   // other details removed
   var template = '<div class="something"><a href="'
                  + url
                  + '" target="_blank">';

   if(summary) {
       template += '<span class="summary">' 
           + summary 
           + '</span>';
   }

   template +=
       +'<strong>Details: </strong><span>'
       + html
       + '</span></a></div>';

  return template;
}

看上去一切OK麻汰,沒有問題。F5刷新頁面戚篙,看起來不大對:

first_try_fail.png

你知道哪里出問題了嗎五鲫?

由上面的代碼生成的HTML長這樣:

<div class="something"><a  target="blank">  
    <span class="summary">The summary</span>NaNThis is the inner message</span></a>
</div>  

發(fā)現(xiàn)問題了嗎?如果沒發(fā)現(xiàn)岔擂,我們接著往下看位喂。

你的線上代碼真的沒有BUG嗎?歡迎免費使用Fundebug!我們可以幫助您第一時間發(fā)現(xiàn)BUG!

字符串拼接 vs 加法

仔細查看生成的HTML代碼乱灵,你會發(fā)現(xiàn)NaN出現(xiàn)在</span>標(biāo)記的后面塑崖,然而<strong>標(biāo)簽不見了。NaN是一個很好的線索痛倚,表明這里有類型轉(zhuǎn)換發(fā)生规婆,并且是轉(zhuǎn)換為Number類型,但是我當(dāng)時一直沒有找到發(fā)生轉(zhuǎn)換的原因!

接下來抒蚜,我們先溫習(xí)一下JavaScript基礎(chǔ)知識掘鄙。在JavaScript中,根據(jù)+左右兩邊變量的類型的不同嗡髓,+符號可以用于數(shù)字相加或則字符串拼接操漠。

console.log('value:' + 3);           // 'value:3'  
console.log(3 + 1);                   // 4  
console.log('value:' + 3 + '+' + 1); // 'value:3+1'  
console.log('value:' + 3 + 1);       // 'value:31'  
console.log('value:' + (3 + 1));     // 'value:4'  
console.log(3 + ' is the value');    // '3 is the value'  

在上面的這些例子中,如果+的任何一邊是字符串饿这,那么另一邊一定會轉(zhuǎn)換為字符串浊伙。否則,將看做是數(shù)字相加蛹稍。

因此吧黄,NaN預(yù)示著一定是字符串被誤用為數(shù)字了。但我并沒有使用parseInt()函數(shù)做類型轉(zhuǎn)換唆姐,所以邏輯上說不通稗挚!

問題原因

最終奉芦,我逐步縮小出錯區(qū)域赵抢,發(fā)現(xiàn)是如下代碼出錯:

template +=  
       +'<strong>Details: </strong><span>'
       + html
       + '</span></a></div>';

如果你還是沒看出來,那么我們換個寫法:

template += +'<strong>Details: </strong><span>' + html + '</span></a></div>';  

我用了string += +string這樣的寫法声功,也就是說:由于寫代碼的時候拷貝黏貼烦却,不小心整了一個多余的+號?所以先巴,相當(dāng)于使用了一元運算+其爵。根據(jù)一元運算符(+)的官方解釋:+c會顯示地將c轉(zhuǎn)換為Number類型。

這就是我的代碼出現(xiàn)bug的根源:一元運算符+號嘗試將<strong>Details: </strong><span>轉(zhuǎn)換為數(shù)字伸蚯,但是失敗了返回NaN摩渺。然后NaN又轉(zhuǎn)換為字符串拼接起來。當(dāng)我把這個額外的+刪掉后剂邮,代碼就正確運行了摇幻。

額外建議

另外值得一提的是,我使用了gulp-uglify來壓縮我的JavaScript代碼挥萌。在構(gòu)建過程中绰姻,一元運算(+'<strong>Details: </strong><span>')已經(jīng)在壓縮后的代碼中存儲為NaN了。Gulp已經(jīng)識別出代碼錯誤引瀑。

從這一次Debug的經(jīng)歷吸取了一個教訓(xùn):不要馬馬虎虎的拷貝黏貼代碼狂芋!而且我立即想到如果有一個小的gulp插件可以識別并提醒壓縮代碼中有莫名其妙的NaN的話,也可以適當(dāng)避免問題憨栽。

補充

> parseInt('<strong>Details: </strong><span>')
NaN
> +'<strong>Details: </strong><span>'
NaN


版權(quán)聲明:
轉(zhuǎn)載時請注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/11/20/bug-fix-concatenated-string-trun-into-numbers/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末帜矾,一起剝皮案震驚了整個濱河市辆影,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黍特,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锯蛀,死亡現(xiàn)場離奇詭異灭衷,居然都是意外死亡,警方通過查閱死者的電腦和手機旁涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門翔曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人劈愚,你說我怎么就攤上這事瞳遍。” “怎么了菌羽?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵掠械,是天一觀的道長。 經(jīng)常有香客問我注祖,道長猾蒂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任是晨,我火速辦了婚禮肚菠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罩缴。我一直安慰自己蚊逢,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布箫章。 她就那樣靜靜地躺著烙荷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炉抒。 梳的紋絲不亂的頭發(fā)上奢讨,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音焰薄,去河邊找鬼拿诸。 笑死塞茅,一個胖子當(dāng)著我的面吹牛亩码,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播描沟,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吏廉!你這毒婦竟也來了泞遗?” 一聲冷哼從身側(cè)響起席覆,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎佩伤,沒想到半個月后聊倔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體生巡,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年孤荣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盐股。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖遂庄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涛目,我是刑警寧澤秸谢,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布霹肝,位于F島的核電站,受9級特大地震影響沫换,放射性物質(zhì)發(fā)生泄漏臭蚁。R本人自食惡果不足惜讯赏,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漱挎。 院中可真熱鬧系枪,春花似錦磕谅、人聲如沸私爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捌浩。三九已至工秩,卻和暖如春嘉栓,著一層夾襖步出監(jiān)牢的瞬間拓诸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工奠支, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抚芦。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像叉抡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子褥民,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

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