10個(gè)常見(jiàn)的JavaScript BUG

就算最牛的JavaScript開(kāi)發(fā)者也會(huì)犯錯(cuò)十气。有時(shí)候?qū)е鲁绦虻膱?zhí)行結(jié)果和預(yù)期不一樣砸西,有時(shí)候根本無(wú)法運(yùn)行。這里我總結(jié)了10個(gè)常見(jiàn)的錯(cuò)誤衅疙,我相信不管是初級(jí)還是資深開(kāi)發(fā)者都可能遇到鸳慈。

1.相等混淆

x是否和y相等走芋?x是否為真潘鲫?在JavaScript中溉仑,如何正確地做相等判斷很重要浊竟,但似乎很多人搞不清楚津畸。簡(jiǎn)單概括一下洼畅,主要是下面三種情況:條件判斷(if, &&, etc.),相等操作符(==)徘郭,和嚴(yán)格相等操作符(===)丧肴。

甚至芋浮,有的時(shí)候會(huì)不小心把賦值(=)當(dāng)做相等操作符使用,千萬(wàn)不要搞錯(cuò)了镇草!

避免使用賦值(=)

賦值(=)將右邊的表達(dá)式賦值給左邊的變量梯啤,例如:

var a = 3;

該語(yǔ)句聲明了一個(gè)新的變量a存哲,值為3。

表達(dá)式可以是程序中的任何東西察滑,想象把它類(lèi)比為語(yǔ)言中的名詞贺辰,操作符(+,-,*,/)類(lèi)比為動(dòng)詞魂爪。初學(xué)者一個(gè)常見(jiàn)的錯(cuò)誤就是誤用賦值(=)作為相等判斷符。

if (a=4){...}

代碼并不會(huì)像預(yù)期的執(zhí)行那樣蒋川。

慎用相等操作符

相等操作符(==)和他的雙胞胎不等操作符(!=)非常好用捺球,但也很危險(xiǎn)夕冲,盡量少用歹鱼。接下來(lái)介紹為什么:

0 == '0'

在相等符號(hào)下,0和0是相等的南片!因?yàn)榻忉屍靼l(fā)現(xiàn)左右類(lèi)型不一致疼进,首先做了隱式類(lèi)型轉(zhuǎn)換秧廉。這會(huì)導(dǎo)致各種各樣的問(wèn)題,然后一出錯(cuò)還很難找到問(wèn)題原因嚼锄。

如果你真的想判斷一個(gè)字符串包含的數(shù)字和某個(gè)數(shù)字是否真的相同蔽豺,建議你這么做:

parseInt(0) === parseInt('0')

所以,建議使用嚴(yán)格相等/不等操作符。

0 === '0'

會(huì)返回false濒析。

2.丟失的大括號(hào)

當(dāng)程序變得復(fù)雜啥纸,特別是如果你使用JavaScript對(duì)象來(lái)存儲(chǔ)數(shù)據(jù)的話,大括號(hào)會(huì)越來(lái)越多主经。下面是一段代碼罩驻,但是少了一個(gè)大括號(hào):

{“status”: “OK”,“results”: [{ “id”: 12, “title”: “Coding JavaScript For Dummies”, “author”: “Chris Minnick and Eva Holland”, “publication_date”: ““, “summary_short”: ““, “l(fā)ink”: { “type”: “review”, “url”: ““, “l(fā)ink_text”: “Read the New York Times Reviewof Coding JavaScript For Dummies” }, “awards”: [{ “type”: “Nobel Prize”, “url”: ““, }]}

你能看出來(lái)哪里少了東西嗎惠遏?當(dāng)不確定的時(shí)候节吮,一個(gè)好的編輯器將會(huì)非常有用判耕。Sublime Text有一個(gè)很不錯(cuò)的功能,當(dāng)你把光標(biāo)放在某個(gè)大括號(hào)的時(shí)候帚豪,和它匹配的大括號(hào)會(huì)高亮出來(lái)志鞍。

3.不匹配的引號(hào)

在定義字符串的時(shí)候固棚,你可以自由使用單引號(hào)或則雙引號(hào)此洲。但是呜师,如果一個(gè)字符串單引號(hào)開(kāi)始汁汗,雙引號(hào)結(jié)束就不行了知牌。而且你需要注意本身字符串中的單引號(hào)或則雙引號(hào)斤程。

var movieName = “Popeye’; // error!var welcomeMessage = ‘Thank you, ‘ + firstName + ‘, let’s learn JavaScript!’ // error!

總的來(lái)說(shuō),個(gè)人認(rèn)為是一個(gè)非常靈活且好用的功能沮峡,但是一定要小心亿柑!

缺少必要的圓括號(hào)

該錯(cuò)誤往往在條件語(yǔ)句出錯(cuò)處,特別是有多個(gè)條件的時(shí)候秘症。

if (x > y) && (y < 1000) {...}

如果你注意看乡摹,會(huì)發(fā)現(xiàn)少了括號(hào)采转,正確的應(yīng)該是這樣:

if ((x > y) && (y < 1000)) {...}

4.缺少分號(hào)

JavaScript中的語(yǔ)句都應(yīng)該分號(hào)結(jié)束板熊。但如果這些語(yǔ)句各自占一行干签,那么你不寫(xiě)分號(hào)也沒(méi)關(guān)系容劳。不過(guò)不建議使用闸度,因?yàn)闀?huì)有潛在問(wèn)題竭贩。如果你使用自動(dòng)代碼美化工具可能錯(cuò)誤的將不同行的代碼合并而出錯(cuò)。

最好的策略是都要加分號(hào)莺禁。

5.大寫(xiě)錯(cuò)誤

JavaScript對(duì)大小寫(xiě)敏感留量,你需要對(duì)變量和函數(shù)的命名小心,不能把大小寫(xiě)搞錯(cuò)了哟冬。比如楼熄,Document對(duì)象的getElementById函數(shù)經(jīng)常被寫(xiě)錯(cuò)為getElementByID。

6.在加載前引用

JavaScript的代碼通常是按順序執(zhí)行浩峡,如果你引用了后面才創(chuàng)建的元素將會(huì)報(bào)錯(cuò)孝赫。

document.getElementById(“myDiv”).innerHTML = “This div is my div”;

This div is your div.

在腳本執(zhí)行的時(shí)候,瀏覽器還不知道m(xù)yDiv是什么红符。

避免這個(gè)問(wèn)題的方法有很多:

將代碼放到最后,也就是后面

將代碼放到函數(shù)中预侯,并且和body的onload綁定。

function nameMyDiv() {document.getElementById(“myDiv”).innerHTML = “This div is my div”;}

This div is your div

7.濫用保留字做變量名

一個(gè)很難被追蹤的問(wèn)題就是使用保留字做變量名飒货。JavaScript中有超過(guò)60個(gè)保留字。當(dāng)然,你不可能都把它們記住來(lái)避免使用呻惕。最好的方法就是使用更加具有描述性的字符來(lái)命名變量盲泛。

舉個(gè)例子,name是一個(gè)保留字由境。如果你喜歡用name纺阔,那么最好細(xì)化质况,比如firstName,lastName,dogName和nameOfTheWind。

8.作用域問(wèn)題

JavaScript中有函數(shù)作用域和全局作用域。如果你沒(méi)有使用var關(guān)鍵字來(lái)聲明慷嗜,那么它是全局的。為了確保不同作用域的安全隔離,建議使用var。譯者補(bǔ)充:建議使用let奴紧,更加安全,可參考本文:ES6之”let”能替代”var”嗎?。

小編推薦一下我的前端教程學(xué)習(xí)群:657137906,如果你對(duì)前端感興趣或者是想要學(xué)習(xí)前端知識(shí)攀痊,小編歡迎你加入凿叠。小編會(huì)在群中不定期分享干貨炒刁,包括我精心整理的一份前端零基礎(chǔ)教程里伯。歡迎各位初學(xué)和進(jìn)階中的小伙伴。

9.函數(shù)調(diào)用缺少參數(shù)

在JavaScript中,在函數(shù)調(diào)用的時(shí)候少了幾個(gè)參數(shù),有時(shí)候并不會(huì)出錯(cuò)翅溺,但可能達(dá)不到預(yù)期的執(zhí)行結(jié)果叙凡。所以,確保你傳入了足夠的函數(shù)參數(shù)燥撞。

10.從0開(kāi)始

永遠(yuǎn)不要忘記數(shù)組是從0開(kāi)始。

var myArray = new Array();myArray[10] = “List of 10 Common Mistakes”;myArray.length; // 輸出11!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌航缀,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雪标,死亡現(xiàn)場(chǎng)離奇詭異龄糊,居然都是意外死亡搔扁,警方通過(guò)查閱死者的電腦和手機(jī)忠聚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骑祟,“玉大人谭期,你說(shuō)我怎么就攤上這事胀瞪∑嗟” “怎么了忍级?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵窖剑,是天一觀的道長(zhǎng)翠储。 經(jīng)常有香客問(wèn)我欣除,道長(zhǎng)室叉,這世上最難降的妖魔是什么踪旷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮豁辉,結(jié)果婚禮上埃脏,老公的妹妹穿的比我還像新娘。我一直安慰自己秋忙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布构舟。 她就那樣靜靜地躺著灰追,像睡著了一般。 火紅的嫁衣襯著肌膚如雪狗超。 梳的紋絲不亂的頭發(fā)上弹澎,一...
    開(kāi)封第一講書(shū)人閱讀 51,624評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音努咐,去河邊找鬼苦蒿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛渗稍,可吹牛的內(nèi)容都是我干的佩迟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竿屹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼报强!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起拱燃,我...
    開(kāi)封第一講書(shū)人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秉溉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體召嘶,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡父晶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弄跌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲喝。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碟绑,靈堂內(nèi)的尸體忽然破棺而出俺猿,到底是詐尸還是另有隱情,我是刑警寧澤格仲,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布押袍,位于F島的核電站,受9級(jí)特大地震影響凯肋,放射性物質(zhì)發(fā)生泄漏谊惭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一侮东、第九天 我趴在偏房一處隱蔽的房頂上張望圈盔。 院中可真熱鬧,春花似錦悄雅、人聲如沸驱敲。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)众眨。三九已至,卻和暖如春容诬,著一層夾襖步出監(jiān)牢的瞬間娩梨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工览徒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狈定,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓习蓬,卻偏偏與公主長(zhǎng)得像纽什,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子躲叼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line)稿湿,也就是一...
    悟名先生閱讀 4,149評(píng)論 0 13
  • FreeCodeCamp - Basic JavaScript 寫(xiě)在前面: 我曾經(jīng)在進(jìn)谷前刷過(guò)這一套題,不過(guò)當(dāng)時(shí)只...
    付林恒閱讀 16,445評(píng)論 5 28
  • 深入理解JavaScript系列文章押赊,包括了原創(chuàng)饺藤,翻譯包斑,轉(zhuǎn)載,整理等各類(lèi)型文章涕俗,如果對(duì)你有用罗丰,請(qǐng)推薦支持一把,給大...
    DaveWeiYong閱讀 603評(píng)論 0 1
  • 一再姑、JS前言 (1)認(rèn)識(shí)JS 也許你已經(jīng)了解HTML標(biāo)記(也稱為結(jié)構(gòu))萌抵,知道了CSS樣式(也稱為表示),會(huì)使用HT...
    凜0_0閱讀 2,772評(píng)論 0 8
  • 第三遇見(jiàn)閱讀 166評(píng)論 0 0